4

我敢肯定我在想這個問題,但我似乎無法弄清楚如何簡單地創建和提交一次多個記錄。我有一個用戶模型和一個預測模型。用戶has_many預測,並且預測屬於用戶。當我訪問用戶/ 1 /預測/新的,我需要創建6條預測記錄,並立即提交他們的分貝我嵌套像這樣多個記錄提交沒有嵌套

:resources users do 
    :resources predictions 
end 

我的路線。

在我的預測控制器:

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條記錄,用於多場比賽,因爲這是一款夢幻體育應用。

+0

爲什麼你不想使用嵌套窗體?看起來他們完全適合你的問題。 –

+0

我絕對可以使用它們,我想我沒有正確理解這個概念。我認爲嵌套屬性只有在您一次創建或編輯兩個模型時纔有意義。在我的情況下,用戶已經存在,我只需要爲該用戶創建3個預測並將它們提交到一起。 – jktress

+0

ActiveRecord不應更新現有的用戶記錄,除非您對其進行更改,所以我認爲在您的案例中使用嵌套表單是完全可以接受的。您對現有用戶記錄的問題和擔憂非常敏感。 +1爲好思維 –

回答

2

我認爲,第一個項目,嵌套的路線可能不是你正在尋找的方法。這可能會將您與表格上的1個新模型預測記錄綁定。

您確實需要在您的模型中使用accepts_nested_attributes_for。使用該設置使用form_for(如果可能,請使用simple_form_for,使用simple_form寶石)。然後用代碼 form_for @user do | f | 使用f.fields_for:預測

用戶控制器保存方法也將自動驗證並保存嵌套記錄。

正如你可能知道的,瑞恩貝茨對此很棒railscasts