我有一个名为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。 我很困惑,为什么我收到这个错误,并希望得到任何帮助!
答案 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,因此在验证规则后无效