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

Ruby on rails Ruby/Rails-使用符号或字符串定义模型,ruby-on-rails,ruby,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\u

我有以下代码:

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\u type].find(params[:reviewable\u id])
的操作来简化此过程,基本上使用param中包含的字符串作为模型的名称?

这应该可以:

params[:reviewable_type].constantize.find(params[:reviewable_id])
但出于安全原因,我建议不要这样做(提示:我猜您会在
params[:reviewable\u type]
中找到类似
User
的内容)

至少你应该这样做:

if ['Offer', 'Request'].include?(params[:reviewable_type])
  params[:reviewable_type].constantize.find(params[:reviewable_id])
end
这应该起作用:

params[:reviewable_type].constantize.find(params[:reviewable_id])
但出于安全原因,我建议不要这样做(提示:我猜您会在
params[:reviewable\u type]
中找到类似
User
的内容)

至少你应该这样做:

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

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

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

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

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

太棒了,非常感谢。谢谢你的安全提示。太棒了,非常感谢。谢谢你的安全提示。