【问题标题】:Rails simple_form association select with create optionRails simple_form 关联选择与创建选项
【发布时间】:2012-01-15 00:01:11
【问题描述】:

我有一个带有 belongs_to 关联的表单,我希望用户能够从他们的地址中进行选择,或者创建一个新地址。当表单由于参数中的信息冲突而出现验证错误时,它会中断,即

"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 会自动将&lt;input id="transaction_address_attributes_id" name="transaction[address_attributes][id]" type="hidden" value="25"&gt; 添加到我的表单末尾,导致参数冲突并给出错误:

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

我想有一种更好的方法来处理控制器中的参数。有任何想法吗?我曾考虑使用 javascript 来删除和重新呈现“地址属性”表单,但我宁愿不依赖 javascript。

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-3 associations nested-forms simple-form


    【解决方案1】:

    我写了guide to doing nested model forms in rails,在那里我解决了创建或选择问题。

    但是您的问题与您的控制器有关。没有代码很难说,但是 afaik 似乎发生的事情是在创建过程中出现问题(验证错误),地址被保存,因此 ID 存储在 Transaction 中,但是因为验证失败,地址创建被回滚,但 ID 仍保留在您的(未保存的)事务中,给您观察到的错误。

    在再次渲染新地址之前,您可以将 address_id 设置为 nil,但这取决于是创建了新地址还是选择了现有地址。

    希望这会有所帮助。

    【讨论】:

    • 感谢您的信息。 cocoon 是否有禁用 javascript 的后备功能?
    • 我试过了,但有一些问题......例如如果嵌套关联中的字段验证失败,则在页面重新加载时它会消失。
    • 请在 github 上发布问题,以便我进一步调查。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多