![](/img/trans.png)
[英]Rails has_many :through with collection_select form helper
[英]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
我的“銀行”表中已經添加了一些銀行,我想添加一個簽名者,並通過下拉列表填充相關的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"}
但是,我收到錯誤消息未定義的局部變量或方法“ bank”。 如果我添加線
bank = Bank.find(1)
在create動作中,顯然可以。 如何/何時/在何處定義“ bank”變量? 我在控制器中缺少什么讓表單將'bank_id'屬性傳遞給'bank'變量,然后將其保存到我的簽名者表中? 謝謝。
您可以通過以下參數設置bank變量:
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
嗎?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.