新手问题 A has_many B, 如何在 A show page 创建 B

LinuxGit · 2018年07月05日 · 最后由 LinuxGit 回复于 2018年07月05日 · 1561 次阅读

github: https://github.com/LinuxGit/idc_bot

Model 关系如下:

class Server < ApplicationRecord
  has_many :vms, dependent: :destroy
end
class Vm < ApplicationRecord
  belongs_to :server
end

我想在某个 server 的页面创建 vm,如 http://localhost:3000/servers/2 页面 , 使用 build 使 vm 的 server_id 可以自动关联到该 server 的 id,

class ServersController < ApplicationController
  def show
    @vm = @server.vms.build
  end
end

但如果在 vm controller 使用 build, @server 其实为 nil,

class VmsController < ApplicationController
  def create
    @vm = @server.vms.build(vm_params)
  end
end

目前使用表单把 server_id 也传过去,如下图,这种方式不太好,server 字段我不希望显示出来可修改,希望自动关联。 求教,这种场景如何解决?

怎么说呢,你把 rails 官方文档前几章读完就知道怎么搞了。

server id 放路由里面

# routes.rb
# resource :servers, module: 'servers' do
#   resources :vms
# end

#app/controllers/servers/vms_controller.rb
class Servers::VmsController < ApplicationController
  # POST /servers/:id/vms
  def create
    @server.vms.build(vm_params)
  end
end

How DHH Organizes His Rails Controllers

首先,如果你是要创建 vm,我觉得页面应该叫 new,而不是 show

基于如上:

创建 vm 页面的地址: http://localhost:3000/servers/:server_id/vms/new

发起创建 vm 的请求:http://localhost:3000/servers/:server_id/vms (post )

你的 routes.rb:


resources :servers, only: :show do
  resources :vms, only: [:new, :create]
end
class VmsController < ApplicationController
  # 渲染创建页面的action
  def new
    @vm = Vm.new    
  end

  def create 
    server = Server.find params[:server_id]
    server.vms.create!(vm_params)
  end

  private
  def vm_params
    # .....
  end
end

建议楼主补一下 rails 基础,以及 resour 相关的。

@coderliu @tinyfeng @alixiaomiao @lithium4010 多谢各位指点,我之前参考的 Ruby on Rails Tutorial twitter 样例,所以准备在 show page 直接创建。我最近正在补官方 rails guide。😅

LinuxGit 关闭了讨论。 07月06日 02:13
需要 登录 后方可回复, 如果你还没有账号请 注册新账号