Rails 4 参数;如何将参数列入一组值的白名单



我已经阅读了一些帖子,例如在 Rails 4 中使用强参数的值白名单,但这不是我所需要的。

我有一个控制器,它接受一个 ID 并加载一个模型。它还可以选择接受查询字符串参数(style(,它可以是3个值之一,smallmediumlarge。这被传递给模型上的方法,该方法使用它来获取附加的图像(使用回形针(。我注意到如果我传递一个无效的参数(例如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,更改表单中的值等(,他们应该得到一个错误页面。

我暗示常量是在模型中定义的,但它不应该存在,因为它与业务逻辑无关,但与模型的显示有关。如果您有模型装饰器,请在此处定义它。

最新更新