什么时候使用强参数?

时间:2014-07-06 11:30:42

标签: ruby-on-rails-4 strong-parameters

我理解在我们创建对象并将其放入数据库的情况下使用强参数。例如,

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)了吗?

需要更新吗?

3 个答案:

答案 0 :(得分:0)

我使用updateupdate_attributes方法调用对Rails 4环境进行了实验,我收到了两个方法调用的相同错误:ActiveModel::ForbiddenAttributesError in PeopleController#update 。在控制器中,我使用了@person.update(params[:person])@person.update_attributes(params[:person]);这就是它在错误消息中说PeopleController的原因。

基于API documentation,在Rails 4中看起来update_attributesupdate的别名。所以我猜update_attributes与Rails 4中的update方法完全相同:

update_attributes(attributes)公开

ActiveRecord::Persistence#update的别名

因此,updateupdate_attributes方法都必须使用强参数来更新数据库。我还使用强参数测试了update_attributes方法:@person.update_attributes(person_parameters)并且它有效

<强>更新

关于update_attributeupdate_column方法。我刚刚通过控制器测试了这些,并且使用这些方法你不需要在控制器内使用强参数(这对我来说有点意外),即使你使用params(用户提供的值)。因此,使用update_attributeupdate_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。如果您没有对参数进行清理,最终用户可以轻松伪造请求以获取权限并危及您的应用程序安全性。

关于你的上一个问题,你是对的。您不需要强参数来使用您已知的值更新记录。