更新
我在下面回答了我的问题,但我仍然想要一个更漂亮的方法来实现我的目标。我有一种感觉,我的控制器对如何做事了解太多。
我的VideoController中有一个创建动作:
def create
method = 'get_' + params[:video][:provider] + '_video_id'
provider_video_id = Video.send(method, params[:video][:url])
thumb = Video.get_thumb_from_youtube(provider_video_id)
@video = Video.new(params[:video], :provider_video_id => provider_video_id, :thumb => thumb, :views => 0, :likes => 0)
if @video.save!
redirect_to video_path('1'), notice:'Video added successfully.'
else
render :new
end
end
我使用params[:video]
调用Video.new,并从用户填写的表单中获取其信息。然后我操纵用户传入的URL以恢复video_provider_id
和{{ 1}}。
但是,Rails没有使用thumb
和provider_video_id
保存视频...我在保存时收到此错误:
thumb
我的猜测是Validation failed: Thumb can't be blank, Thumb is invalid, Provider video can't be blank
方法不接受额外的参数......
答案 0 :(得分:1)
模型中之前的保存回调怎么样?这是一个不受欢迎的默认值示例,但您也可以传递params。
after_initialize :url
private
def url
self.provider_video_id ||= "default value"
end
答案 1 :(得分:1)
但是如果你愿意,你总是可以用
之类的东西覆盖默认的新动作class Video
def new(attr1, attr2)
super
#do something with attr2
end
end
答案 2 :(得分:1)
您可能想要使用.merge()
:
而不是
method = 'get_' + params[:video][:provider] + '_video_id'
params[:video][:provider_video_id] = Video.send(method, params[:video][:url])
params[:video][:thumb] = Video.get_thumb_from_youtube(params[:video][:provider_video_id])
params[:video][:views] = params[:video][:likes] = 0
@video = Video.new(params[:video])
你可以做(修改原始问题的代码):
@video = Video.new(params[:video].merge(:provider_video_id => provider_video_id, :thumb => thumb, :views => 0, :likes => 0))
这会将params合并为一个哈希值。
答案 3 :(得分:0)
我解决了这个问题。我认为Ruby on Rails的new
方法不接受多个参数,通常是params
。我做的是以下内容:
method = 'get_' + params[:video][:provider] + '_video_id'
params[:video][:provider_video_id] = Video.send(method, params[:video][:url])
params[:video][:thumb] = Video.get_thumb_from_youtube(params[:video][:provider_video_id])
params[:video][:views] = params[:video][:likes] = 0
@video = Video.new(params[:video])
现在,似乎有效。