Rails:如何在一个表单中使用fields_for和同一个类的两个对象?

时间:2011-07-04 17:57:19

标签: ruby-on-rails ruby-on-rails-3

我正在尝试在Rails 3中使用form_forfields_for让我在一个页面上编辑两个对象(同一个类),但我没有运气:第二个对象的HTML输入标签与第一个对象的ID相同。

具体情况:

  • 我有一个班级Card。我正在尝试遵循一般的RESTful模式。
  • 大多数卡片独立,但少数卡片通过“链接”属性与第一个卡片对象相关联。 (我将这些称为“多部分”卡片。)
  • 我希望可以使用标准的卡片编辑页面(views / cards / edit.html.erb和views / cards / _form.html.erb)将卡片从独立模式切换到多部分模式。当用户在编辑页面上选择多部分模式时,我正在使用JavaScript来显示表单上的第二组编辑字段。因此,每个卡的编辑表单需要 包含第二张卡的表单字段,可能成为正在编辑的主卡的“链接”编辑卡。
  • 第二张卡片的HTML字段应与第一张卡片的HTML字段相同。我的字段和输入有一个复杂漂亮的HTML布局,我想保持干燥,避免重复第二张卡片领域的所有代码。

事实证明这确实存在问题。我尝试了各种各样的事情:

<%= form_for(@card) do |outer_form| %>
...
 <% [@card, @card2].each_with_index do |card, card_index| %>
  <%= fields_for card do |f| %>

这不起作用,因为第二个对象的HTML输入标签与第一个对象的ID相同。他们两者都提出了HTML <select id="card_rarity" name="card[rarity]">,这显然是错误的。

我尝试将引用的行改为

 <% [@card, @card2].each_with_index do |card, card_index| %>
  <%= fields_for (card_index == 0 ? card : card.link) do |f| %>

希望这会提供像“card [link] [rarity]”这样的HTML名称。 (编辑:)但它没有:即使使用fields_for card.link,它仍然会生成name="card[rarity]"的表单字段。因此页面有两个具有相同名称和ID的输入,并在提交时丢弃其中一个。

我试着说

 <% [@card, @card2].each_with_index do |card, card_index| %>
  <%= fields_for card, :as => (card_index == 0 ? "card" : "card2") do |f| %>

但这也不起作用。 :as参数似乎完全被忽略了。

有人能提出我在这里缺少的方法吗?我发现official documentation on form_for and fields_for非常有帮助。

(编辑添加:)特别是,肯定必须有一种方法来编辑单个Rails表单中同一个类的两个不同对象的字段? fields_for使用不同类的任意数量的对象完成此操作变得微不足道 - 但是如何为同一个类中的两个对象执行此操作?

非常感谢!

1 个答案:

答案 0 :(得分:1)

你说:

  

希望这会提供像“card [link] [rarity]”这样的HTML名称,但问题是Rails在对象上调用class_name,并且在大多数情况下card.link是Nil。我不希望提交此表单以自动为所有卡片创建虚拟链接卡,这是我认为在这种情况下会发生的。

我会更多地追求这个策略。在编辑控制器操作中,我会添加@card.link ||= Card.new以防止出现访问错误;在更新控制器操作中(或者如果你想在那里延迟逻辑,则在卡模型本身中),确保丢弃空的“链接”卡。