2011-09-19 57 views
1

有很多類似的主題,但它不幫助我。 有一個帳戶模型使用來自窗體中關聯模型的數據,Rails 3

class Account < ActiveRecord::Base 
    belongs_to :user 
    belongs_to :currency 

    attr_accessible :currency 
    accepts_nested_attributes_for :currency 
end 

我加入attr_accessible和accepts_nested_attributes_for,但實際上我不知道他們需要與否。發生

<%= form_for @account do |f| %> 

    <div class="field"> 
<%= f.label :name %><br /> 
<%= f.text_field :name %> 
    </div> 

    <div class="field"> 
<%= f.label :currency %><br /> 
<%= select_tag(:currency, options_from_collection_for_select(Currency.all, :id, :name),\ 
     :id => "account_currency_id", :name => "account[currency][id]", :prompt => "Выберите валюту...")%> 
    </div> 

<div class="actions"> 
<%= f.submit "Сохранить" %> 
    </div> 

<% end %> 

,當我試圖箱帳戶錯誤:美元,歐元,盧布

class Currency < ActiveRecord::Base 
    has_many :accounts 
    attr_accessible :id 

    accepts_nested_attributes_for :accounts 
end 

所以在帳戶形式我有一個貨幣選擇框 - 即有3個項目的另一個模型貨幣:

ActiveRecord::AssociationTypeMismatch in AccountsController#create 
Currency(#52889580) expected, got ActiveSupport::HashWithIndifferentAccess(#28841960) 

請求參數:

{"utf8"=>"✓", 
    "authenticity_token"=>"VfCshuGyldoI5Q5DThT/RDpwewCh91apgsnmxyppWqI=", 
    "account"=>{"name"=>"Основной наличный счет", 
    "currency"=>{"id"=>"3"}}, 
    "commit"=>"Save"} 

如果我嘗試從標識手動查找貨幣:

param = params[:account] 
param[:currency] = Currency.find(param[:currency][:id]) 
@account = Account.new(param) 

有由巫名稱一個新的錯誤不存在。我不喜歡我應該手動設置:id => "account_currency_id", :name => "account[currency][id]",因爲默認情況下它們都是「貨幣」。 Rails 3.1

回答

3

在你的情況,我認爲你是對的,當你質疑accepts_attributes_for的必要性。我認爲有一個更簡單的方法來實現這一點。

首先,請刪除列出的兩種型號中的accepts_nested_attributes_for。同時從兩個模型中刪除attr_accesible,這不是必需的。這實際上是名稱未設置的原因,帳戶模型只接受貨幣變量的散列分配。

其次,在您的表單中,您應該使用屬性currency_id而不是currency[id]。這樣,你永遠不需要經過另一個模型。這裏是我會做:

<%= f.select(:currency_id, 
      options_from_collection_for_select(Currency.all, :id, :name), 
      :prompt => "Выберите валюту...") %> 

注意,我從select_tag改爲f.select。這樣你就不需要手動指定:id或者:name。 form_for與選擇幫助者一起爲你照顧。

總之,當您需要更改關聯模型中的某些值或創建/銷燬它的實例時,accepts_nested_attributes_for的使用主要是有用的。在你的情況下,你只鏈接到現有的貨幣模型而不做任何改變。

+0

非常感謝。此外,我的問題是,帳戶有列'貨幣'沒有'_id',所以我加了它,它現在正常工作。 – zishe

+0

很高興能聽到:) – DanneManne

1

除非是嵌套資源,否則您不需要:attr_accessible或:accepched_nested_attributes_for。 attr_accessible is used for mass assignmentaccepts_nested_attributes_for定義了指定關聯的屬性編寫器。

更改select_tag到這樣的事情:

<%= f.select(:currency_id, options_from_collection_for_select(Currency.all, :id, :name), :prompt => "Выберите валюту...") %> 
+0

謝謝,它的工作原理。 – zishe