繁体   English   中英

强参数允许嵌套属性的所有属性

[英]strong parameters permit all attributes for nested attributes

有没有办法在强参数中允许nested_attributes 模型的所有属性? 这是一个示例代码。

class Lever < ActiveRecord::Base
 has_one :lever_benefit
 accepts_nested_attributes_for :lever_benefit
end

class LeverBenefit < ActiveRecord::Base
  # == Schema Information
  #  id          :integer          not null, primary key
  #  lever_id    :integer
  #  explanation :text
end

对于杠杆强参数,我目前正在写这个

def lever
 params.require(:lever).permit(:name,:lever_benefit_attributes => [:lever_id, :explanation])
end

有没有办法让我可以编写嵌套属性来允许所有属性,而无需明确给出属性名称,如lever_idexplanation

注意:请不要与permit!混淆这个问题permit! permit(:all)这用于允许所有嵌套属性

我遇到的唯一允许嵌套参数哈希中的任意键对我来说似乎合理的情况是写入序列化列时。 我设法像这样处理它:

class Post
  serialize :options, JSON
end

class PostsController < ApplicationController
  ...

  def post_params
    all_options = params.require(:post)[:options].try(:permit!)
    params.require(:post).permit(:title).merge(:options => all_options)
  end
end

try确保我们不需要:options键的礼物。

实际上有一种方法可以将所有嵌套参数列入白名单。

params.require(:lever).permit(:name).tap do |whitelisted|
  whitelisted[:lever_benefit_attributes ] = params[:lever][:lever_benefit_attributes ]
end

这种方法优于其他解决方案。 它允许允许深度嵌套的参数。

而其他解决方案如:

nested_keys = params.require(:lever).fetch(:lever_benefit_attributes, {}).keys
params.require(:lever).permit(:name,:lever_benefit_attributes => nested_keys)

别。


来源:

https://github.com/rails/rails/issues/9454#issuecomment-14167664

首先,确保您确实希望允许嵌套散列中的所有值。 通读Damien MATHIEU 的回答,了解潜在的安全漏洞...

如果您仍然需要/想要允许散列中的所有值(有完全有效的用例,例如存储非结构化的、用户提供的记录元数据),您可以使用以下代码位实现它:

def lever_params
  nested_keys = params.require(:lever).fetch(:lever_benefit_attributes, {}).keys
  params.require(:lever).permit(:name,:lever_benefit_attributes => nested_keys)
end

注意:这与tf. 的答案非常相似,但更优雅一些,因为您不会得到任何Unpermitted parameters: lever_benefit_attributes警告/错误。

我很惊讶没有人提出这个建议:

params.require(:lever).permit(:name,:lever_benefit_attributes => {})

尝试

params.require(:lever).permit(:name, leave_benefit_attributes: LeaveBenefit.attribute_names.collect { |att| att.to_sym })

强参数的全部意义在于其名称:使您的输入参数强。
允许所有参数将是一个非常糟糕的主意,因为它会允许任何人插入您不一定希望由您的用户更新的值。

在您提供的示例中,您提到了当前需要提供的两个参数:
[:lever_id, :explanation]

如果您允许所有参数,则有人可以更改任何其他值。
created_at ,或例如lever_id

这肯定是一个安全问题,这就是为什么你不应该这样做。
当你这样做时,明确指定你的所有属性可能看起来很无聊。
但这对于确保您的应用程序安全是必要的。

编辑:对于那些反对这一点的人。 这可能不是您正在寻找的答案,但却是您需要的答案。
将所有嵌套属性列入白名单是一个巨大的安全漏洞,强参数试图保护您,您正在删除它。
看看是什么导致构建 strong_params,以及不使用它对你有什么危害: https ://gist.github.com/peternixey/1978249

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM