1

アップデート

以下の質問に答えましたが、目標を達成するためのより良い方法を求めています. コントローラーが物事のやり方を知りすぎているような気がします。


VideoController に create アクションがあります。

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_idますthumb

ただし、Railsはビデオを保存していませんprovider_video_id...thumb保存時にこのエラーが発生します:

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

私の推測では、newメソッドは追加のパラメーターを受け入れません...

4

4 に答える 4

1

モデルの保存前のコールバックはどうですか? これは頭​​から離れたデフォルト値の例ですが、params を渡すこともできます。

after_initialize :url


private
def url
  self.provider_video_id ||= "default value"
end
于 2012-06-30T16:17:17.140 に答える
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))

これにより、パラメーターが 1 つのハッシュにマージされます。

于 2012-06-30T23:42:36.970 に答える
1

ただし、必要に応じて、デフォルトの新しいアクションを次のようなものでいつでもオーバーライドできます

class Video 

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

end
于 2012-06-30T18:35:05.080 に答える
0

私は問題を解決しました。newRuby on Railsのメソッドは、通常はである複数のパラメーターを受け入れないと思います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 に答える