在 Rails 4 中允许使用强参数的特殊情况下的额外参数
Permit extra params in special cases with Strong Params in Rails 4
所以对于一个组织,我希望用户能够编辑一些关于它的东西。
params.require(:organization).permit(:name, :location)
但在特殊情况下,我希望管理员能够编辑额外的属性
params.require(:organization).permit(:name, :location, :secrets)
现在我知道我可以只用一个 if 语句来选择我想使用哪一行,但是由于管理员将始终能够编辑原始属性,我希望能够像这样轻松地包含它们:
permitted = params.require(:organization).permit(:name, :location)
permitted.permit(:secrets) if current_user.admin?
有什么方法可以像这样链接许可调用吗?或者我是否必须做一些事情,比如将属性存储在一个数组中,并在进行许可调用之前有条件地添加额外的内容?
这似乎是要走的路:
def permitted_params
if current_user.admin?
params.require(:organization).permit(:name, :location, :secrets)
else
params.require(:organization).permit(:name, :location)
end
end
然后在您的控制器中使用 permitted_params
。
使用以下技术,无需将相同的参数写入两次,如果您的属性列表很长,这将很有帮助。
def organization_params
attributes = [:name, :location]
attributes.push(:secrets) if current_user.admin?
params.require(:organization).permit(attributes)
end
你要做的很简单:
def organization_params
basic_filter = %w(name location)
filter = user.admin? ? basic_filter.push('secrets') : basic_filter
params.require(:organization).permit(filter)
end
这将如您所见:
[20] pry(main)> params = ActionController::Parameters.new({
[20] pry(main)* organization: {
[20] pry(main)* name: 'Francesco',
[20] pry(main)* location: 'L.A.',
[20] pry(main)* secrets: 'secrets'
[20] pry(main)* }
[20] pry(main)* })
=> {"organization"=>{"name"=>"Francesco", "location"=>"L.A.", "secrets"=>"secrets"}}
[21] pry(main)> basic_filter = %w(name location)
=> ["name", "location"]
[22] pry(main)> filter = true ? basic_filter.push('secrets') : basic_filter
=> ["name", "location", "secrets"]
[23] pry(main)> params.require(:organization).permit(filter)
=> {"name"=>"Francesco", "location"=>"L.A.", "secrets"=>"secrets"}
并且如果 user.admin?
为 false,则结果将为
[26] pry(main)> basic_filter
=> ["name", "location", "secrets"]
[27] pry(main)> basic_filter = %w(name location)
=> ["name", "location"]
[28] pry(main)> filter = false ? basic_filter.push('secrets') : basic_filter
=> ["name", "location"]
[29] pry(main)> params.require(:organization).permit(filter)
Unpermitted parameter: secrets
=> {"name"=>"Francesco", "location"=>"L.A."}
这可能对您有所帮助。
所以对于一个组织,我希望用户能够编辑一些关于它的东西。
params.require(:organization).permit(:name, :location)
但在特殊情况下,我希望管理员能够编辑额外的属性
params.require(:organization).permit(:name, :location, :secrets)
现在我知道我可以只用一个 if 语句来选择我想使用哪一行,但是由于管理员将始终能够编辑原始属性,我希望能够像这样轻松地包含它们:
permitted = params.require(:organization).permit(:name, :location)
permitted.permit(:secrets) if current_user.admin?
有什么方法可以像这样链接许可调用吗?或者我是否必须做一些事情,比如将属性存储在一个数组中,并在进行许可调用之前有条件地添加额外的内容?
这似乎是要走的路:
def permitted_params
if current_user.admin?
params.require(:organization).permit(:name, :location, :secrets)
else
params.require(:organization).permit(:name, :location)
end
end
然后在您的控制器中使用 permitted_params
。
使用以下技术,无需将相同的参数写入两次,如果您的属性列表很长,这将很有帮助。
def organization_params
attributes = [:name, :location]
attributes.push(:secrets) if current_user.admin?
params.require(:organization).permit(attributes)
end
你要做的很简单:
def organization_params
basic_filter = %w(name location)
filter = user.admin? ? basic_filter.push('secrets') : basic_filter
params.require(:organization).permit(filter)
end
这将如您所见:
[20] pry(main)> params = ActionController::Parameters.new({
[20] pry(main)* organization: {
[20] pry(main)* name: 'Francesco',
[20] pry(main)* location: 'L.A.',
[20] pry(main)* secrets: 'secrets'
[20] pry(main)* }
[20] pry(main)* })
=> {"organization"=>{"name"=>"Francesco", "location"=>"L.A.", "secrets"=>"secrets"}}
[21] pry(main)> basic_filter = %w(name location)
=> ["name", "location"]
[22] pry(main)> filter = true ? basic_filter.push('secrets') : basic_filter
=> ["name", "location", "secrets"]
[23] pry(main)> params.require(:organization).permit(filter)
=> {"name"=>"Francesco", "location"=>"L.A.", "secrets"=>"secrets"}
并且如果 user.admin?
为 false,则结果将为
[26] pry(main)> basic_filter
=> ["name", "location", "secrets"]
[27] pry(main)> basic_filter = %w(name location)
=> ["name", "location"]
[28] pry(main)> filter = false ? basic_filter.push('secrets') : basic_filter
=> ["name", "location"]
[29] pry(main)> params.require(:organization).permit(filter)
Unpermitted parameter: secrets
=> {"name"=>"Francesco", "location"=>"L.A."}
这可能对您有所帮助。