2014-10-28 70 views
0

我有以下代碼:的Ruby/Rails - 使用符號或字符串來定義模型

if params[:reviewable_type] == 'Offer' 

     reviewable = Offer.find(params[:reviewable_id]) 

    elsif params[:reviewable_type] == 'Request' 

     reviewable = Request.find(params[:reviewable_id]) 

end 

我可以做類似params[:reviewable_type].find(params[:reviewable_id]),基本上是使用包含在參數作爲名稱的字符串簡化此該模型?

回答

3

constantize後。

但是,您真的不應該盲目地允許用戶實例化任意類的實例。您應該經常檢查傳入的參數是否包含您預期的白名單中的類別之一:

if %w(Offer Request).include?(params[:reviewable_type]) 
    reviewable = params[:reviewable_type].constantize.find(params[:reviewable_id]) 
end 
+0

太棒了,非常感謝。並感謝您的安全提示。 – domi91c 2014-10-28 03:14:50

1

這應該工作:

params[:reviewable_type].constantize.find(params[:reviewable_id]) 

但我不建議這樣做安全方面的原因(提示:想你已經發現在params[:reviewable_type]User)。

至少你應該做這樣的事情:

if ['Offer', 'Request'].include?(params[:reviewable_type]) 
    params[:reviewable_type].constantize.find(params[:reviewable_id]) 
end 
相關問題