我有以下代码:
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中包含的字符串作为模型的名称吗?
答案 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