сохранение значений с использованием вложенных_атрибутов на ruby

У меня есть вложенные атрибуты для комментария. Родительский класс — 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 и еще одна строка из вторых полей ввода.


person Sadiksha Gautam    schedule 31.01.2011    source источник
comment
Как вы пытаетесь сохранить эти вложенные модели? Можете ли вы опубликовать код здесь, чтобы лучше понять?   -  person Syed Aslam    schedule 31.01.2011


Ответы (2)


Вы создаете форму, в которой есть поля с одинаковыми идентификаторами. Это приводит к недопустимому HTML и неправильно обрабатывается всеми (большинством) браузерами.

Вам необходимо сгенерировать уникальные идентификаторы, для этого используйте 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], чтобы получить имя пользователя1 и пользователя2.

Изменив идентификаторы на что-то более полезное (я не помню, как идентификаторы должны быть именами atm...), вы можете «группировать» поля для пользователей, чтобы вы могли использовать что-то вроде params[:user1][:name], которое может лучше соответствовать вашей таблице. .

Изменить: вы уже ознакомились с field_for? В нем есть несколько хороших примеров моделей и необходимых форм.

person Veger    schedule 31.01.2011

Я исправил это с помощью моего друга. У меня есть этот код в моем контроллере.

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

Итак, что происходит, когда я создаю сообщение, два комментария 1-й со значением адрес: адрес1, имя пользователя: пользователь1 и 2-й со значением адрес: адрес2, имя пользователя: пользователь2 сохраняются при сохранении сообщения!

person Sadiksha Gautam    schedule 18.02.2011