在Ruby on Rails中创建其他模型时自动生成模型

时间:2013-05-09 21:37:44

标签: ruby-on-rails ruby-on-rails-3 validation activerecord has-many

我有一个名为Video的模型,它有很多状态。我想创建各种状态,并将其添加到视频控制器的def创建中的@ 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

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

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