Отправка нескольких записей без вложенности

Я уверен, что обдумал эту проблему, но я не могу понять, как просто создать и отправить несколько записей одновременно. У меня есть модель пользователя и модель прогнозирования. У пользователя есть_много прогнозов, и прогноз принадлежит пользователю. Я вложил свои маршруты так

:resources users do 
    :resources predictions
end

когда я посещаю пользователей/1/predictions/new, мне нужно создать 6 записей прогнозов и сразу отправить их в базу данных.

В моем контроллере прогнозов:

before_filter :load_user

def new
  3.times { @user.predictions.build }
end

def create
  @prediction = @user.predictions.new(params[:prediction])
  if @prediction.save
    redirect_to @user, :notice => 'Prediction added'
  else
    redirect_to @user, :notice => 'Unable to add'
  end
end

def destroy
  @prediction = @user.prediction.find(params[:id])
  @prediction.destroy
  redirect_to @user, :notice => "Prediction deleted"
end

private

def load_user
  @user = current_user
end

И в моем прогнозе new.html.erb:

<%= form_for ([@user, @user.predictions.new]) do |f| %>
<div class="fields">
    <%= f.label :position %>
    <%= f.text_field :position %>
</div>
<div class="fields">
    <%= f.label :athlete_id, 'Athlete'%>
    <%= f.collection_select(:athlete_id, Athlete.all, :id, :name, :prompt => 'Select an athlete' )%>
</div>
<div class="fields">
    <%= f.label :race_id, 'Race'%>
    <%= f.collection_select(:race_id, Race.upcoming, :id, :name, :prompt => 'Select a race' )%>
</div>
<div class="actions"><%= f.submit %></div>
<% end %>

Это показывает и отправляет только одну запись вместо 3. Я подумал, что мне, возможно, придется использовать :accepts_nested_attributes_for, однако мне не нужно создавать и обновлять модели пользователей одновременно. Существующие пользователи будут создавать прогнозы по 3 записи за раз для нескольких гонок, так как это приложение для фэнтези-спорта.


person jktress    schedule 24.08.2011    source источник
comment
Почему вы не хотите использовать вложенные формы? Кажется, что они идеально подходят для вашей проблемы.   -  person Wizard of Ogz    schedule 25.08.2011
comment
Я определенно могу их использовать, я думаю, я не понял концепцию должным образом. Я думал, что вложенные атрибуты имеют значение только тогда, когда вы создаете или редактируете две модели одновременно. В моем случае пользователь уже существует, и мне просто нужно создать 3 прогноза для этого пользователя и отправить их вместе.   -  person jktress    schedule 25.08.2011
comment
ActiveRecord не должен обновлять существующую запись пользователя, если вы не внесете в нее изменения, поэтому я думаю, что в вашем случае вполне приемлемо использовать вложенные формы. Ваши вопросы и опасения по поводу существующей записи о пользователе были очень проницательны. +1 за хорошее мышление   -  person Wizard of Ogz    schedule 25.08.2011


Ответы (1)


Я думаю, что самый первый элемент, вложенный маршрут, может быть не тем подходом, который вы ищете. Это может связать вас с 1 новой записью прогноза модели в форме.

Вы действительно хотите accepts_nested_attributes_for в своей модели. С этим набором используйте form_for (и, если возможно, simple_form_for, используя гем simple_form). Затем с помощью такого кода, как form_for @user, выполните |f| использовать f.fields_for: предсказание

Методы сохранения пользовательского контроллера также автоматически проверяют и сохраняют вложенные записи.

Как вы, возможно, знаете, у Райана Бейтса есть отличные railscasts для этого.

person Michael Durrant    schedule 28.08.2011