Rails 3 представляет форму с несколькими записями
Я новичок в рельсах, поэтому это, вероятно, основной вопрос. Я пытаюсь создать форму, в которой пользователь может создать сразу 3 записи. Я хочу, чтобы пользователь только один раз нажал кнопку отправки. Я представляю модель моего отзыва, комментарий и рейтинг. В настоящее время в базу данных вводится только последняя запись.
<%= form_for([@user,@review]) do |f| %>
<table>
<tr>
<td>Rank</td>
<td>Name</td>
<td>Comment</td>
</tr>
<tr>
<td>1</td>
<td><%= f.text_field :name %></td>
<td><%= f.text_field :comment %></td>
<%= f.hidden_field :rating, :value=> "5" %>
</tr>
<tr>
<td>2</td>
<td><%= f.text_field :name %></td>
<td><%= f.text_field :comment %></td>
<%= f.hidden_field :rating, :value=> "3" %>
</tr>
<tr>
<td>3</td>
<td><%= f.text_field :name %></td>
<td><%= f.text_field :comment %></td>
<%= f.hidden_field :rating, :value=> "1" %>
</tr>
</table>
<div class="actions">
<%= f.submit "Create my top 3" %>
</div>
<% end %>
Любые советы приветствуются. Спасибо.
Ответы
Ответ 1
Я бы рекомендовал использовать fields_for
для этого:
<%= form_for([@user, :reviews]) do |f| %>
<% @reviews.each do |review| %>
<%= fields_for review do |r| %>
<%= render "reviews/form", :r => r %>
<% end %>
<% end %>
<% end %>
Чтобы выполнить эту работу, вам нужно будет создать столько объектов просмотра, сколько требуется в вашем контроллере:
def new
# you could also have this in a before_filter...
@user = User.find(params[:id])
@reviews = Array.new(3) { @user.reviews.build }
end
Это создаст новые экземпляры записей обзора для этого пользователя, которые отличаются от новых записей. Экземпляры - это просто объекты Ruby. Теперь, поскольку вы вызвали @user.reviews.build
три раза, вы увидите три отзыва в своем представлении.
def create
@user = User.find(params[:id])
@reviews = Review.create(params[:reviews])
# Some more logic for validating the parameters passed in
end
Это создаст три новых объекта Review
и свяжет их с @user
, если все три будут действительными.
Ответ 2
Вам нужно указать рельсы на массив. Во-первых, прочитайте этот раздел этой статьи:
Для вашей цели вам нужно будет вручную создать форму:
<%= form_tag 'foo' do %>
<% [1,3,5].each do |i| %>
<%= text_field_tag 'review[][name]' %>
<%= text_field_tag 'review[][comment]' %>
<%= hidden_field_tag 'review[][rating]', :value => i %>
<% end %>
<% end %>