Rails 表单助手通过 collection_select 添加关联模型
Rails form helper adding an associated model through collection_select
我在通过 collection_select 方法添加关联模型时遇到问题。这是我的两个模型
class Signatory < ActiveRecord::Base
belongs_to :bank
end
和
class Bank < ActiveRecord::Base
has_many :signatories
end
我已经在我的 "banks" table 中添加了一些银行,我想添加一个签名者,并通过下拉列表填充相关的 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"}
但是,我收到错误消息 undefined local variable or method 'bank'。如果我添加行
bank = Bank.find(1)
在创建操作中,它显然会起作用。 How/When/where 我要定义 'bank' 变量吗?我在控制器中缺少什么让表单将 'bank_id' 属性传递给 'bank' 变量,然后将其保存到我的签名 table 中?谢谢。
您可以像这样从这些参数设置银行变量:
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
当您从散列或 URL 中的另一个参数知道银行并且您想要补充表单中不存在的参数时,您遵循的 bank.signatories.build
模式会更有帮助。在这种情况下,唯一可用的参数直接来自表单 (params[:signatory][:bank_id]
).
这里 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
?
我在通过 collection_select 方法添加关联模型时遇到问题。这是我的两个模型
class Signatory < ActiveRecord::Base
belongs_to :bank
end
和
class Bank < ActiveRecord::Base
has_many :signatories
end
我已经在我的 "banks" table 中添加了一些银行,我想添加一个签名者,并通过下拉列表填充相关的 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"}
但是,我收到错误消息 undefined local variable or method 'bank'。如果我添加行
bank = Bank.find(1)
在创建操作中,它显然会起作用。 How/When/where 我要定义 'bank' 变量吗?我在控制器中缺少什么让表单将 'bank_id' 属性传递给 'bank' 变量,然后将其保存到我的签名 table 中?谢谢。
您可以像这样从这些参数设置银行变量:
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
当您从散列或 URL 中的另一个参数知道银行并且您想要补充表单中不存在的参数时,您遵循的 bank.signatories.build
模式会更有帮助。在这种情况下,唯一可用的参数直接来自表单 (params[:signatory][:bank_id]
).
这里 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
?