2012-06-30 52 views
1

UPDATERuby on Rails的模型方法「新」不接受額外的參數

我回答我下面的問題,但我仍然要求一個漂亮的方式來實現我的目標。我有一種感覺,我的控制器知道太多如何做事


我在我的視頻控制器創建操作:

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_idthumb視頻......我得到保存這個錯誤:

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

我的猜測是new方法不接受額外的參數...

回答

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

現在,它似乎工作。

1

模型中的保存前回調如何?這是我頭腦默認值的例子,但是你也可以傳遞參數。

after_initialize :url 


private 
def url 
    self.provider_video_id ||= "default value" 
end 
+0

您的解決方案看起來不錯,但我不確定我是否理解。我需要調用一個方法來獲得provider_video_id,所以我可以寫:'self.provider_video_id = get_provider_video_id(params [:video] [:url]'? –

1

但是,如果你願意,你可以一直覆蓋的東西,如

class Video 

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

end 

歡呼默認新動作

+0

好的解決方案,但它不完全是我正在尋找的。很多! –

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合併成一個哈希值。

+0

沒錯,現在可讀性更強! –