我已经阅读了一些帖子,例如在 Rails 4 中使用强参数的值白名单,但这不是我所需要的。
我有一个控制器,它接受一个 ID 并加载一个模型。它还可以选择接受查询字符串参数(style
(,它可以是3个值之一,small
,medium
或large
。这被传递给模型上的方法,该方法使用它来获取附加的图像(使用回形针(。我注意到如果我传递一个无效的参数(例如style=wibble
(,那么我会收到 400 错误并通知内部文件路径不存在。布拉克曼还指出这是一个安全问题......
def show
style = params[:style] || :medium
thing = Model.find(params[:id])
path = "#{Rails.root}/public#{thing.image_url(style)}"
content_type = thing.image.content_type || 'image/png'
send_file path, type: content_type, disposition: 'inline'
end
我们在其他地方使用动作控制器参数效果很好;但我看不出这怎么会"白名单"参数选项?我看到的任何地方都说使用模型验证器,但这是假设我提交一个参数来更新模型,但我不是。
我知道我可以做这样的事情:
return head :not_found unless %w(small medium large).include? style
这是最好的方法吗?
我为此编写了一个扩展ActionController::Parameters
的 gem:将参数值列入白名单。它简单而轻巧。你会像这样使用它:
def model_params
params.require(:model).permit(:style, :other_attribute).allow(style: %w[small medium large])
end
希望你觉得有用
https://github.com/msimonborg/allowable
首先,您需要定义一个常量,将所有有效的style
值列入白名单(我认为size_type
是一个更明确的名称(。(注意符号/字符串比较(。
然后,如果params[:style]
未包含在白名单值中,则返回 404,或者回退到'medium'
:
style = Model::AVAILABLE_SIZE_TYPES.include?(params[:style]) ? params[:style] || Model::AVAILABLE_SIZE_TYPES.first
就个人而言,我不喜欢用户输入的回退。他们做错了什么(操纵URL,更改表单中的值等(,他们应该得到一个错误页面。
我暗示常量是在模型中定义的,但它不应该存在,因为它与业务逻辑无关,但与模型的显示有关。如果您有模型装饰器,请在此处定义它。