簡體   English   中英

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

我的“銀行”表中已經添加了一些銀行,我想添加一個簽名者,並通過下拉列表填充相關的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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM