我有一个带有belongs_to关联的表单,我希望用户能够从他们的地址中选择,或者创建一个新地址。由于参数中的信息冲突,即表格有验证错误时它会中断,即
"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 %>
交易#create controller
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删除并重新呈现&#34;地址属性&#34;形式,但我宁愿不依赖于JavaScript。
答案 0 :(得分:0)
我写了guide to doing nested model forms in rails,在那里我解决了创建或选择问题。
但是,您的问题与您的控制器有关。没有代码就很难分辨,但是看起来似乎发生的事情是,在创建中出现问题(验证错误),地址被保存,因此ID存储在Transaction
中,但是因为验证失败,地址创建被回滚,但ID仍然保留在您的(未保存的)事务中,从而为您提供错误。
在再次渲染新内容之前,您可以将address_id
设置为nil,但这取决于是创建了新地址还是选择了现有地址。
希望这有帮助。