Ruby on rails 表单之后如何更改rails中的受保护属性

Ruby on rails 表单之后如何更改rails中的受保护属性,ruby-on-rails,mass-assignment,Ruby On Rails,Mass Assignment,我觉得这个问题太简单了,我不知道如何用谷歌搜索它 在RoR中,如果我有一个受保护的属性,如:premium或:admin,并且我只想在用户做了一些特定的事情(注册premium帐户或提供电话号码这样简单的事情)时更改它,我将如何做?它应该只有在满足某些条件时才会改变,但我不希望有人能够伪造这些条件 我知道像“premimum”或“admin”这样的事情,我希望通过大规模分配来避免。那么,如果用户填写了某个表单,您如何更改它呢 请随意给我指点任何有用的链接,我只是不知道该如何表达,但我认为这是一个

我觉得这个问题太简单了,我不知道如何用谷歌搜索它

在RoR中,如果我有一个受保护的属性,如
:premium
:admin
,并且我只想在
用户
做了一些特定的事情(注册premium帐户或提供电话号码这样简单的事情)时更改它,我将如何做?它应该只有在满足某些条件时才会改变,但我不希望有人能够伪造这些条件

我知道像“premimum”或“admin”这样的事情,我希望通过大规模分配来避免。那么,如果用户填写了某个表单,您如何更改它呢

请随意给我指点任何有用的链接,我只是不知道该如何表达,但我认为这是一个简单的解决方案。

阅读

您可以创建角色

attr_accessible :first_name, :last_name                            # default role
attr_accessible :first_name, :last_name, :premium, :as => :special # 'special' role
在此模型上调用
.update_attributes(params)
时,将使用默认角色;如果在
参数中找到
:premium
,它将抛出一个错误

在特殊表单的
POST
方法中,您需要为
更新_属性
指定
:special
角色,如
.update_属性(参数,:special)
,指导
update\u attributes
使用
:special
角色,该角色允许批量分配
:premium
属性

您可以根据
params
中的某些属性有条件地传递角色名称,就像电话号码具有您提到的值一样

@the_model.update_attributes(params, params[:phone_no].present? ? :special : :default)

如果这些条件比较复杂,您可以考虑将它们作为类方法添加到模型

def self.special_role?(params)
  # fancy conditions here, returning true/false
end
然后,
update\u属性

@the_model.update_attributes(params, TheModel.special_role?(params) ? :special : :default)

使用
:role
选项完全可以避免大规模分配?我在将其与CanCan相结合时也遇到了一些问题。必须
skip\u load\u resource:only=>…
才能添加角色。谢谢