【问题标题】:Rails Strong Parameters either in root or nested object根或嵌套对象中的 Rails 强参数
【发布时间】:2018-08-01 00:47:41
【问题描述】:
我希望能够在任一根参数对象中支持一组参数:
?foo=a
params.permit(:foo)
或者在嵌套对象中:
?bar[foo]=a
params.require(:bar).permit(:foo)
我将参数从表单对象传递到该控制器,因此嵌套对象自然发生,但我还希望能够在查询字符串中传递根对象中的参数并支持两者。
有没有一种优雅、简洁的方法来实现这一点?
【问题讨论】:
标签:
ruby-on-rails
strong-parameters
【解决方案1】:
require 类似于[],但在缺少值时会出现异常(很像Hash#fetch)。如果嵌套结构存在,您可以直接使用 [] 来获取嵌套结构,否则返回到根 params:
(params[:bar] || params).permit(:foo)
【解决方案2】:
请记住,require 与 permit 不同。
require 方法可确保存在特定参数。没有必要在嵌套的上使用,它确保需要的参数出现在参数中,否则会抛出错误。
你可以像这样使用嵌套属性
params = ActionController::Parameters.new({
person: {
name: "Francesco",
age: 22,
pets: [{
name: "Purplish",
category: "dogs"
}]
}
})
permitted = params.permit(person: [ :name, { pets: :name } ])
permitted.permitted? # => true
permitted[:person][:name] # => "Francesco"
permitted[:person][:age] # => nil
permitted[:person][:pets][0][:name] # => "Purplish"
permitted[:person][:pets][0][:category] # => nil
你可以查看这个here的文档