在哪里以及如何分配用户:rails 3.1中attr_accessible的管理员角色?

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,catrabbit,那么这个:

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,那么(使用我们的最后一个模型示例)它将为猫,兔子和马设置谷仓的属性.但这只是使用属性角色的一种方法.如果您想以不同的方式使用它们,完全取决于您.