我正在尝试在Rails 3中使用form_for
和fields_for
让我在一个页面上编辑两个对象(同一个类),但我没有运气:第二个对象的HTML输入标签与第一个对象的ID相同。
具体情况:
Card
。我正在尝试遵循一般的RESTful模式。事实证明这确实存在问题。我尝试了各种各样的事情:
<%= 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
使用不同类的任意数量的对象完成此操作变得微不足道 - 但是如何为同一个类中的两个对象执行此操作?
非常感谢!
答案 0 :(得分:1)
你说:
希望这会提供像“card [link] [rarity]”这样的HTML名称,但问题是Rails在对象上调用class_name,并且在大多数情况下card.link是Nil。我不希望提交此表单以自动为所有卡片创建虚拟链接卡,这是我认为在这种情况下会发生的。
我会更多地追求这个策略。在编辑控制器操作中,我会添加@card.link ||= Card.new
以防止出现访问错误;在更新控制器操作中(或者如果你想在那里延迟逻辑,则在卡模型本身中),确保丢弃空的“链接”卡。