use*_*363 10 ruby-on-rails ruby-on-rails-3.1
在http://edgeguides.rubyonrails.org/security.html第6.1节的Rails指南中,它介绍了attr_accessible的一个角色:作为选项,
attr_accessible :name, :is_admin, :as => :admin
Run Code Online (Sandbox Code Playgroud)
我的问题是,如果用户登录,我在哪里以及如何将用户分配到:admin角色,这样她/他就有权使用attr_accessible进行大规模分配?我也可以定义自己的角色,例如group_to_update吗?如果是,那么group_to_update的定义应该包含哪些内容?
谢谢.
Ben*_*Lee 32
您正在以模糊的方式使用某些技术术语,这使得您对此过程的理解变得混乱,因此我将首先清理此术语.
我在哪里以及如何将用户分配到:admin角色
:as参数中使用的"角色" attr_accessible不是用户角色.这是一个属性角色.这意味着除非在设置属性的语句中指定了该角色,否则将保护属性不被覆盖.因此,该系统独立于任何用户系统.您的应用程序甚至不需要让用户在批量分配中担任角色.
我可以定义自己的角色,例如group_to_update
角色根本不是任何正式意义上的"定义".在任何需要角色的地方,只需使用任何符号/字符串(例如:group_to_update)作为角色.无需提前在任何其他地方指定它.
这是它的工作原理.通常,在将散列大量分配给模型属性期间,所有模型的属性都用作指定散列的键.所以,如果你有一个Barn模型,barn它的实例,有三个属性horse,cat和rabbit,那么这个:
barn.attributes = params
Run Code Online (Sandbox Code Playgroud)
基本上和做的一样:
barn.horse = params[:horse]
barn.cat = params[:cat]
barn.rabbit = params[:rabbit]
Run Code Online (Sandbox Code Playgroud)
现在,如果您attr_accessible在谷仓模型上设置任何一个,则在使用质量分配时,只会更新您在此处设置的属性.例:
class Barn < ActiveRecord::Base
attr_accessible :cat
attr_accessible :rabbit
end
Run Code Online (Sandbox Code Playgroud)
然后这个:
barn.attributes = params
Run Code Online (Sandbox Code Playgroud)
只会这样做:
barn.cat = params[:cat]
barn.rabbit = params[:rabbit]
Run Code Online (Sandbox Code Playgroud)
因为只有'猫'和'兔子'设置为可访问('马'不是).现在考虑设置这样的属性角色:
class Barn < ActiveRecord::Base
attr_accessible :cat
attr_accessible :rabbit, :as => :banana
end
Run Code Online (Sandbox Code Playgroud)
首先,请注意,只要是符号/字符串,角色就可以按照您想要的任何内容.在这种情况下,我发挥了作用:banana.现在,当您在attr_accessible属性上设置角色时,通常不会分配该角色.这个:
barn.attributes = params
Run Code Online (Sandbox Code Playgroud)
现在只会这样做:
barn.cat = params[:cat]
Run Code Online (Sandbox Code Playgroud)
但您可以使用该方法使用特定角色分配属性assign_attributes.所以你可以这样做:
barn.assign_attributes(params, :as => :banana)
Run Code Online (Sandbox Code Playgroud)
这将指定所有正常受保护的参数以及受该角色保护的所有参数:banana:
barn.cat = params[:cat]
barn.rabbit = params[:rabbit]
Run Code Online (Sandbox Code Playgroud)
因此,请考虑具有更多属性的更长示例:
class Barn < ActiveRecord::Base
attr_accessible :cat
attr_accessible :rabbit, :as => :banana
attr_accessible :horse, :as => :banana
attr_accessible :cow, :as => :happiness
end
Run Code Online (Sandbox Code Playgroud)
然后,您可以在分配属性时使用这些角色.这个:
barn.assign_attributes(params, :as => :banana)
Run Code Online (Sandbox Code Playgroud)
对应于:
barn.cat = params[:cat]
barn.rabbit = params[:rabbit]
barn.horse = params[:horse]
Run Code Online (Sandbox Code Playgroud)
还有这个:
barn.assign_attributes(params, :as => :happiness)
Run Code Online (Sandbox Code Playgroud)
对应于:
barn.cat = params[:cat]
barn.cow = params[:cow]
Run Code Online (Sandbox Code Playgroud)
现在,如果您选择,您可以使用户角色(例如,用户模型上的"角色"列)对应于任何模型上的属性角色.所以你可以这样做:
barn.assign_attributes(params, :as => user.role)
Run Code Online (Sandbox Code Playgroud)
如果这个user角色碰巧banana,那么(使用我们的最后一个模型示例)它将为猫,兔子和马设置谷仓的属性.但这只是使用属性角色的一种方法.如果您想以不同的方式使用它们,完全取决于您.
| 归档时间: |
|
| 查看次数: |
2898 次 |
| 最近记录: |