Выберите ассоциацию Rails simple_form с опцией создания

У меня есть форма с ассоциацией принадлежности_к, и я бы хотел, чтобы пользователь мог либо выбирать из своих адресов, либо создавать новый. Он ломается, когда форма имеет ошибки проверки из-за противоречивой информации в параметрах, т.е.

"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.


person tom    schedule 07.12.2011    source источник


Ответы (1)


Я написал руководство по созданию вложенных форм моделей в rails, где решаю проблему создания или выбора. .

Однако ваша проблема связана с вашим контроллером. Без кода трудно сказать, но на самом деле, кажется, что при создании что-то идет не так (ошибка проверки), адрес сохраняется, и поэтому идентификатор сохраняется в Transaction, но поскольку проверка не удалась, создание адреса откатывается, но идентификатор по-прежнему остается в вашей (несохраненной) транзакции, что приводит к ошибке, которую вы наблюдаете.

Перед повторным рендерингом нового вы можете просто установить address_id в nil, но это будет зависеть от того, был ли создан новый адрес или был выбран существующий адрес.

Надеюсь это поможет.

person nathanvda    schedule 07.12.2011
comment
Спасибо за информацию. Есть ли у кокона запасной вариант с отключенным javascript? - person tom; 07.12.2011
comment
Я попробовал это, но у меня есть несколько проблем с этим... например. если поле во вложенной ассоциации не проходит проверку, оно исчезает при перезагрузке страницы. - person tom; 07.12.2011
comment
Пожалуйста, опубликуйте проблему на github, чтобы я мог исследовать ее дальше. - person nathanvda; 08.12.2011