0

多くのステータスを持つ Video というモデルがあります。各種類のステータスを作成し、VideosController の def create で @video.statuses に追加したい。

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

4

2 に答える 2

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

そして、コントローラーのステータスについては言及しません。通常どおりに保存します。

最終的な解決策は、ビデオの作成後にステータスの保存を調整する Service オブジェクトを使用することです。このRailsCastの詳細

于 2013-05-09T21:46:57.167 に答える
0

@video を保存する前にステータスを作成しようとしているため、@video.id がないため、検証ルールに従って無効です

于 2013-05-09T21:44:43.080 に答える