Ruby on Rails模型方法'new'不接受额外的参数

时间:2012-06-30 15:48:17

标签: ruby-on-rails

更新

我在下面回答了我的问题,但我仍然想要一个更漂亮的方法来实现我的目标。我有一种感觉,我的控制器对如何做事了解太多。


我的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没有使用thumbprovider_video_id保存视频...我在保存时收到此错误:

thumb

我的猜测是Validation failed: Thumb can't be blank, Thumb is invalid, Provider video can't be blank方法不接受额外的参数......

4 个答案:

答案 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])

现在,似乎有效。