【问题标题】:Using strong parameters require as 'required form attributes' validation使用强参数需要作为“必需的表单属性”验证
【发布时间】:2016-07-22 06:57:16
【问题描述】:

我团队中的一个人建议使用 ActionController::Parameters#require 方法来验证用户是否在表单中提交了“必需”输入。

对我来说,它不太适合,因为您必须将错误与 ActiveRecord 模型分开处理(存在:true)。

因此,例如,假设我们有一个具有 :name、:age 和 :zip_code 的用户。并且 :name 和 :age 是必需的。

他想要这样的东西:

def user_params
  params.require(:user).require(:name)
  params.require(:user).require(:age)
  params.require(:user).permit(:zip_code)
end

对我来说,Strong Parameters 似乎不是为此目的而设计的,而像 presence: true 这样的模型验证要干净得多。

您认为什么是好的做法?为什么使用一个而不是另一个?

【问题讨论】:

    标签: ruby-on-rails


    【解决方案1】:

    模型验证与此完全不同。您有模型验证来实现字段上允许哪些值,哪些是必填字段等......更多的是在业务逻辑方面。但是,强参数是一种安全措施。

    强大的参数可以防止用户更新数据库中不需要的字段。这是一种安全措施,以便应用程序决定可以在数据库中更新哪些字段。例如,如果您的表中有姓名、年龄、邮政编码和登录尝试。 login_attempt 用于计算失败的登录尝试次数。当您没有强参数并且您按如下方式保存用户更改时,

    @user = User.new(params[:user])
    @user.save
    

    用户也可以轻松更新 login_attempt 字段。为了防止这种rails具有强大的参数。因此,您不再容易因为将不需要的字段更新到表中而受到攻击。当您尝试更新不允许的字段时,您会收到此 ForbiddenAttributesError。正确的做法如下,

    def allowed_params
      params.require(:user).permit(:name, :age, :zip_code)
    end
    
    @user = User.new(allowed_params)
    @user.save
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-15
      • 1970-01-01
      • 2020-02-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多