Ruby / Rails - 使用符号或字符串来定义模型

时间:2014-10-28 02:55:38

标签: ruby-on-rails ruby

我有以下代码:

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])的操作来简化此操作,主要是使用param中包含的字符串作为模型的名称吗?

2 个答案:

答案 0 :(得分:3)

你在constantize之后。

但是,您实际上不应该盲目地允许用户实例化任意类的实例。您应该始终检查传入的参数是否包含一个带有白名单的预期类:

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

答案 1 :(得分:1)

这应该有效:

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

但出于安全原因,我建议不要这样做(提示:猜测你在User中找到类似params[:reviewable_type]的内容)。

至少你应该这样做:

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