Rails 3 отправляет форму с несколькими записями - PullRequest
16 голосов
/ 09 января 2011

Я новичок в рельсах, так что это, наверное, основной вопрос. Я пытаюсь создать форму, где пользователь может создать 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 %>

Любой совет приветствуется. Спасибо.

Ответы [ 2 ]

26 голосов
/ 10 января 2011

Я бы порекомендовал использовать 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, при условии, что все три действительны.

6 голосов
/ 10 января 2011

Вам нужно будет указать rails его массив.Во-первых, прочитайте этот раздел этой статьи :

Для вашей цели вам нужно будет создать форму вручную:

<%= 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 %>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...