У меня есть форма с ассоциацией принадлежности_к, и я бы хотел, чтобы пользователь мог либо выбирать из своих адресов, либо создавать новый. Он ломается, когда форма имеет ошибки проверки из-за противоречивой информации в параметрах, т.е.
"transaction" => { "address_id" = "25",
"address_attributes" => { "id" => "25" } }
Я упростил соответствующие файлы:
Транзакция.rb
class Transaction < ActiveRecord::Base
belongs_to :address
accepts_nested_attributes_for :address
end
Адрес.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.