如何将一个对象的id传递给另一个对象的控制器?

时间:2016-01-06 23:09:14

标签: ruby-on-rails ruby parameters

我知道有人问过,但没有解决办法。

我正在尝试将组ID传递给过程控制器,因此我可以将该过程属于该组。

群展视图:

  <%= link_to 'Create a Procedure', new_procedure_path(:group => @group.id), class: 'btn btn-default btn-small' %>

程序控制器:

  def new
    @procedure = Procedure.new
    @group = Group.find(params[:group])

路线:

  resources :groups, only: [:new, :create, :show, :destroy]
  resources :procedures

2 个答案:

答案 0 :(得分:1)

如果需要group_id,请将其作为网址的一部分,并且在表单视图中不需要它。你在params中有group_id:params[:group_id]是控制器应该期待的。

resources :groups, only: [:new, :create, :show, :destroy] do
  resources :procedures
end

在您的控制器中,执行以下操作:

def new
  @group = Group.find(params[:group_id])
  @procedure = @group.procedures.new
end

你会像这样链接到新页面

<%= link_to 'Create a Procedure', new_group_procedure_path(@group), class: 'btn btn-default btn-small' %>

答案 1 :(得分:0)

要进一步添加Swards答案,您正在查看nested resources ...

#config/routes.rb
resources :groups, except: [:edit, :update] do
   resources :procedures #-> url.com/groups/:group_id/procedures/new
end

-

当您向服务器发送请求时,您正在请求&#34;资源&#34;。

HTTP spec定义,

  

客户端向服务器提交HTTP请求消息。服务器,提供HTML文件等资源和其他内容,或代表客户端执行其他功能

这就是Rails路由有resources指令的原因。

在您的情况下,您要求的资源需要依赖另一个父母&#34;资源,因此您使用&#34;嵌套&#34;图案。这提供了&#34;父母&#34;的参数。依赖控制器中的var:

#app/controllers/procedures_controller.rb
class ProceduresController < ApplicationController
   before_action :set_group

   def new
      @procedure = @group.procedures.new
   end

   private

   def set_group
      @group = Group.find params[:group_id]
   end
end  

-

您的关联方式适用于Swards推荐;您也可以从polymorphic_path获益:

<%= link_to 'Create a Procedure', new_polymorphic_path([@group, :procedure]), class: 'btn btn-default btn-small' %>