我团队中的一个人建议使用ActionController :: Parameters#require方法来验证用户是否提交了“必需的”'输入表格。
对我而言,它并不适合,因为您必须与ActiveRecord模型分开处理错误(存在:true)。
因此,举例来说,我们假设我们的用户名为:name,:age和:zip_code。并且:姓名和年龄是必需的。
他想要类似的东西:
def user_params
params.require(:user).require(:name)
params.require(:user).require(:age)
params.require(:user).permit(:zip_code)
end
对我来说,似乎强参数不是为此目的而设计的,而presence: true
等模型验证则更加干净。
您认为什么是良好做法?为什么使用一个而不是另一个?
答案 0 :(得分:1)
模型验证与此完全不同。您有模型验证来实现字段上允许的值,必填字段是什么等等......它更多的是业务逻辑。但是,强参数是一种安全措施。
强大的参数可以防止用户更新数据库中不需要的字段。这是一种安全措施,以便应用程序决定可以在数据库中更新哪些字段。例如,如果表中有name,age,zip_code和login_attempt。 login_attempt用于计算失败的登录尝试次数。如果您没有强参数,并按如下方式保存用户更改,
@user = User.new(params[:user])
@user.save
用户也可以轻松更新login_attempt字段。为了防止这种导轨具有很强的参数。因此,您不再容易将不需要的字段更新到表中。当您尝试更新不允许的字段时,您将获得此ForbiddenAttributesError。正确的方法如下,
def allowed_params
params.require(:user).permit(:name, :age, :zip_code)
end
@user = User.new(allowed_params)
@user.save