1

更新

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


我的 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

我调用 Video.new 并params[:video]从用户填写的表单中获取其信息。然后我操纵用户通过表单传入的 URL 以恢复video_provider_idthumb.

但是,Rails 没有使用provider_video_idand保存视频thumb...我在保存时收到此错误:

Validation failed: Thumb can't be blank, Thumb is invalid, Provider video can't be blank

我的猜测是该new方法不接受额外的参数......

4

4 回答 4

1

模型中的保存前回调如何?这是一个令人难以置信的默认值示例,但您也可以传入参数。

after_initialize :url


private
def url
  self.provider_video_id ||= "default value"
end
于 2012-06-30T16:17:17.140 回答
1

但是如果你愿意,你总是可以用类似的东西覆盖默认的新动作

class Video 

   def new(attr1, attr2)
     super
     #do something with attr2
   end

end
于 2012-06-30T18:35:05.080 回答
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))

这会将参数合并到一个哈希中。

于 2012-06-30T23:42:36.970 回答
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])

现在,它似乎起作用了。

于 2012-06-30T15:54:46.997 回答