3

我有一個belongs_to的ASSOCATION一種形式,我想用戶能夠無論是從他們的地址選擇,或創建一個新的。它打破當窗體上有,因爲在參數相互矛盾的信息驗證錯誤,即Rails的simple_form協會選擇以創建選項

"transaction" => { "address_id" = "25", 
    "address_attributes" => { "id" => "25" } } 

我已經簡化相關文件:

Transaction.rb

class Transaction < ActiveRecord::Base 
    belongs_to :address 
    accepts_nested_attributes_for :address 
end 

Address.rb

class Address < ActiveRecord::Base 
    has_many :transactions 
end 

交易#新觀點

<%= simple_form_for @transaction do |f| %> 

    <%= f.association :address, :collection => current_user.addresses, 
    :include_blank => "Enter new address", 
    :value_method => :id %> 

    <%= f.simple_fields_for :address do |address_fields| %> 
    <%= address_fields.input :line1 %> 
    <%= address_fields.input :line2 %> 
    <%= address_fields.input :city %> 
    <%= address_fields.input :state %> 
    <%= address_fields.input :zip, :label => "Zip/Post Code" %> 
    <% end %> 

    <%= f.submit "Confirm" %> 

<% end %> 

交易#創建控制器

def create 
    trans_params = {} 
    if params[:transaction][:address_id].blank? && !params[:transaction][:address_attributes].nil? 
    trans_params[:address_attributes] = params[:transaction][:address_attributes] 
    elsif !params[:transaction][:address_id].nil? 
    trans_params[:address_id] = params[:transaction][:address_id] 
    end 

    @transaction = Transaction.new(trans_params) 
end 

當然有代碼缺少一大塊,但我認爲這是唯一的相關章節。我遇到的問題是,當你提交表單,並有驗證錯誤,simple_form自動添加<input id="transaction_address_attributes_id" name="transaction[address_attributes][id]" type="hidden" value="25">到我的形式結束,導致參數發生衝突,並給予錯誤:

Couldn't find Address with ID=25 for Transaction with ID= 

我想有是處理控制器中的參數的好方法。有任何想法嗎?我曾考慮使用JavaScript來移除並重新呈現「地址屬性」表單,但我寧願不依賴於JavaScript。

回答

0

我已經寫了guide to doing nested model forms in rails,在這裏我解決了創建或選擇的問題。

但是,您的問題與您的控制器有關。沒有代碼,很難說,但是看起來似乎發生的是在創建過程中出現了錯誤(驗證錯誤),地址被保存,因此ID被存儲在Transaction中,但由於驗證失敗,地址創建會回滾,但ID仍然保留在您的(未保存的)事務中,從而使您發現您觀察到的錯誤。

前再次​​呈現新的,你可以只設置address_id到零,但是這將取決於新的地址是否創建或選擇現有的地址。

希望這會有所幫助。

+0

感謝您的信息。繭有一個後備與JavaScript禁用? – tom

+0

我試了一下,但有幾個問題,例如...如果嵌套關聯中的字段驗證失敗,則在頁面重新加載時消失。 – tom

+0

請在github上發佈問題,以便我可以進一步調查。 – nathanvda