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

然后你不会在你的控制器中提到状态——你会像往常一样保存。

最终的解决方案是使用一个服务对象来协调创建视频后的状态保存。更多在这个RailsCast

于 2013-05-09T21:46:57.167 回答
0

您正在尝试在保存@video 之前创建状态,因此它没有@video.id,因此按照您的验证规则无效

于 2013-05-09T21:44:43.080 回答