使用ruby中的嵌套属性保存值

时间:2011-01-31 11:31:33

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

我有说明评论的嵌套属性。父类是post。

<% form_for @post do |f| %>

...........

<% f.fields_for :comments do |builder| %>

   <%= builder.text_field :name %>
   <%= builder.text_field :address %>
   <%= builder.hidden_field :label, :value => user_1 %>

   <%= builder.text_field :name %>
   <%= builder.text_field :address %>
   <%= builder.hidden_field :label, :value => user_2 %>
   <% end %>

<% end %>

当我保存帖子时我也想保存评论,而且我需要hidden_​​field的不同值,如果我使用表单标签,我不知道它如何保存评论而不在控制器中做任何事情。

我还在帖子模型中使用了:accepts_nested_attributes_for:comment。如果有人能再考虑一下,那就太棒了。

名称,地址和标签是评论的字段。当我保存帖子时,我需要保存两行注释。一个来自第一个text_field,text_field和hidden_​​field,另一个来自第二个输入字段。

2 个答案:

答案 0 :(得分:1)

您创建的表单包含具有相同ID的字段。这导致HTML无效,并且所有(大多数)浏览器都无法正确处理。

您需要生成唯一的ID,以便使用FormTagHelpers。例如:

<% form_tag('/builder') %>
  <%= text_field_tag ':name1' %>
  <%= text_field_tag ':address1' %>

  <%= text_field_tag 'name2' %>
  <%= text_field_tag 'address2' %>
<% end %>

这将生成正确的HTML。现在,您需要更改控制器以处理不同的名称字段。您需要使用params[:name1]params[:name2]来获取user1和user2的名称。

通过将id更改为更有用的内容(我不记得ID应该是名称atm ...),您可以为用户“分组”字段,以便您可以使用params[:user1][:name]之类的内容这可能与你的桌子更好地匹配。

修改:您是否已查看过field_for文档?它有一些很好的模型和所需形式的例子。

答案 1 :(得分:1)

我在朋友的帮助下解决了这个问题 我的控制器中有这个代码

if @post.comments.nil?
  @post.comments.build(:username => "user1") 
  @post.comments.build(:username => "user2") 
end

并以我的形式提供

<%= form_for @post do |f| %>
  <%= f.fields_for :comments do |builder| %>
    <%= builder.label :username, "#{builder.object.username}" %>
    <%= builder.hidden_field :username %>
    <% if builder.object.username == "user1" %>
      <%= builder.text_field :address, :value => "address1" %>
    <% else %>
      <%= builder.text_field :address, :value => "address2" %>
    <% end %>
  <% end %>
<%= f.submit "Create Post" %>
<%end%>

所以,当我创建帖子时,会发生两个评论,第一个是值地址:address1,用户名:user1,第二个是值地址:address2,用户名:user2在保存帖子时保存!