0

我有一個稱爲視頻的模型,它具有許多狀態。我想創建每種類型的狀態並將其添加到VideosController的def create中的@ video.statuses中。在Ruby on Rails中創建其他模型時自動生成模型

在VideosController,我有:

def create 
    @video = Video.new(params[:video]) 
    Kind.all.each do |f| 
     @video.statuses.new(:kind =>f, :kind_id=>f.id,:comment =>"", :time_comp => nil, :completed =>false, :video_id =>@video.id) 
    end 
    respond_to do |format| 
     if @video.save 
     format.html { redirect_to @video, notice: 'Video was successfully created.' } 
     format.json { render json: @video, status: :created, location: @video } 
     else 
     format.html { render action: "new" } 
     format.json { render json: @video.errors, status: :unprocessable_entity } 
     end 
    end 
    end 

然而,這將返回,指出該視頻無法保存,因爲的狀態是無效的錯誤。我整個項目中唯一的驗證是狀態,它只是檢查是否有video_id。 我很困惑,爲什麼我得到這個錯誤,並會感謝任何幫助!

https://github.com/ninajlu/videos

回答

0

您要創建節約@video之前的狀態,所以它沒有@ video.id,因而是無效的有效性規則

3

由於狀態取決於視頻已有以下,您可能想要在創建視頻後創建狀態。

您可以在視頻回調中或控制器中執行此操作。喜歡的東西:

def create 
    @video = Video.new(params[:video]) 
    respond_to do |format| 
    if @video.save 
     Kind.all.each do |f| 
     @video.statuses.create(:kind =>f, :kind_id=>f.id,:comment =>"", :time_comp => nil, :completed =>false, :video_id =>@video.id) 
     end 
     # respond as before 

如果你去回調航線,這將是:

class Video < ActiveRecord::Base 
    after_create :create_statuses 

    def create_statuses 
    Kind.all.each do |f| 
     statuses.create(:kind =>f, :kind_id=>f.id,:comment =>"", :time_comp => nil, :completed =>false, :video_id => self.id) 
    end 
    end 

然後你就不會提及您的控制器狀態 - 你會爲常保存。

最終的解決方案是使用一個服務對象來協調在創建視頻後保存狀態。更多在此RailsCast