Rails形成帮助器通过collection_select添加关联的模型

时间:2015-04-18 14:27:29

标签: ruby-on-rails ruby forms associations

我很难通过collection_select方法添加关联模型。这是我的两个模型

class Signatory < ActiveRecord::Base
belongs_to :bank
end

class Bank < ActiveRecord::Base
has_many :signatories
end

我已经在我的&#34;银行&#34;中添加了一些银行。表,我想添加一个签名者,其中包含通过下拉列表填充的相关bank_id字段。这里是表格的代码:

<%= form_for(@signatory) do |f| %>
  <%= f.label :bank_id %>
  <%= f.collection_select(:bank, Bank.all, :id, :name %>

  <%= f.label :first_name %>
  <%= f.text_field :first_name %>
  <%#-...   %>
<%= f.submit "Add signatory" %>
<% end %>

这些是我的控制器的相关部分:

def new
  @signatory = Signatory.new
end
def create
  @signatory = bank.signatories.build(signatory_params)
  @signatory.save
end

控制台显示以下哈希值,这是我所期望的:

Parameters: {... "signatory"=>{"bank_id"=>"1", "first_name"=>"Al", "last_name"=>"Smith", "email"=>"Al@"}, "commit"=>"Add signatory"}

但是,我收到错误消息未定义的局部变量或方法&#39; bank&#39;。如果我添加行

    bank = Bank.find(1)

在创建动作中,它显然会起作用。如何/何时/何地定义&#39;银行&#39;变量?我在控制器中缺少什么让表单通过&#39; bank_id&#39;归属于&#39;银行&#39;变量然后将其保存到我的签名表中?感谢。

2 个答案:

答案 0 :(得分:1)

您可以使用以下参数设置银行变量:

def create
  bank = Bank.find(params[:signatory][:bank_id])
  @signatory = bank.signatories.build(signatory_params)
  @signatory.save
end

但这是不必要的。直接创建签名者比较简单,例如:

def create
  @signatory = Signatory.new(signatory_params)
  @signatory.save
end

当您从散列或网址中的其他参数知道银行并且您想要补充表单中不存在的参数时,您所关注的bank.signatories.build模式更有用。在这种情况下,唯一可用的参数直接来自表单(params[:signatory][:bank_id])。

答案 1 :(得分:0)

这里不正确地使用collection_select助手:

<%= f.collection_select(:bank, Bank.all, :id, :name %>

重写为:

<%= f.collection_select :bank_id, Bank.all, :id, :name %>

此处bank变量的定义位于此处:

 def create
  @signatory = bank.signatories.build(signatory_params)

你有一些before_action没有显示?