Rails simple_form Ассоциации выберите с опцией создания - PullRequest
3 голосов
/ 07 декабря 2011

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

"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

Transaction # new view

<%= 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 %>

Transaction # 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 для удаления и повторного рендеринга формы «атрибуты адреса», но я бы не стал полагаться на javascript.

1 Ответ

0 голосов
/ 07 декабря 2011

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

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

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

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

...