我理解在我们创建对象并将其放入数据库的情况下使用强参数。例如,
User.create(params[:user])
必须是User.create(params.require(:user).permit(:name, :email, :password)
。
这是标准且易于理解的,但是,更新模型中的列或少数属性时需要强参数吗?
current_user.update_attributes(params[:user])
。那必须是current_user.update_attributes(params.require(:user).permit(:name, :email, :password)
。
最后,我不认为这种情况需要它:
current_user.update_column(authentication_token: nil)
,但是如果我们有params = { authentication_token: nil }
并且current_user.update_column(params)
了吗?
答案 0 :(得分:0)
我使用update
和update_attributes
方法调用对Rails 4环境进行了实验,我收到了两个方法调用的相同错误:ActiveModel::ForbiddenAttributesError
in
PeopleController#update
。在控制器中,我使用了@person.update(params[:person])
和@person.update_attributes(params[:person])
;这就是它在错误消息中说PeopleController
的原因。
基于API documentation,在Rails 4中看起来update_attributes
是update
的别名。所以我猜update_attributes
与Rails 4中的update
方法完全相同:
update_attributes(attributes)
公开
ActiveRecord::Persistence#update
的别名
因此,update
和update_attributes
方法都必须使用强参数来更新数据库。我还使用强参数测试了update_attributes
方法:@person.update_attributes(person_parameters)
并且它有效
<强>更新强>
关于update_attribute
和update_column
方法。我刚刚通过控制器测试了这些,并且使用这些方法你不需要在控制器内使用强参数(这对我来说有点意外),即使你使用params
(用户提供的值)。因此,使用update_attribute
和update_column
方法,您可以在不使用强参数的情况下更新数据库。
答案 1 :(得分:0)
每次将ActionController :: Parameters实例传递给批量分配apis(new,create,update_attributes,update等)之一时,都需要允许相应的字段。
在控制器中,params
方法返回ActionController::Parameters
的实例,其中包含任何哈希值,因此您需要使用permit。
如果你这样做
params = { foo: bar }
record.update_attributes(params) or
record.update_attributes(foo: bar)
然后您传递正常哈希,因此您不需要使用permit
答案 2 :(得分:0)
更新列或少数时需要强参数 模型中的属性?
是,如果使用最终用户的值更新模型。 从不信任用户输入。
假设current_user模型有一个&#39; role_id&#39;列,超级用户可以是1,普通用户可以是2,访客可以是3。如果您没有对参数进行清理,最终用户可以轻松伪造请求以获取权限并危及您的应用程序安全性。
关于你的上一个问题,你是对的。您不需要强参数来使用您已知的值更新记录。