在http://edgeguides.rubyonrails.org/security.html第6.1节的Rails指南中,它引入了attr_accessible的角色:as,
attr_accessible :name, :is_admin, :as => :admin
我的问题是,如果用户登录,我在哪里以及如何将用户分配到:admin角色,这样她/他就有权使用attr_accessible进行批量分配?我也可以定义自己的角色,例如group_to_update吗?如果是,那么应该在group_to_update的定义中进行什么?
感谢。
答案 0 :(得分:32)
您正在以模糊的方式使用某些技术术语,使您对此过程的理解变得混乱,因此我将首先清理此术语。
我在哪里以及如何将用户分配到:admin role
:as
attr_accessible
参数中使用的“角色”不是用户角色。它是属性角色。这意味着除非在设置属性的语句中指定了该角色,否则将保护属性不被覆盖。因此,该系统独立于任何用户系统。您的应用程序甚至不需要让用户在批量分配中担任角色。
我可以定义自己的角色,例如group_to_update
角色根本不是任何正式意义上的“定义”。在任何需要角色的地方,只需使用任何符号/字符串(例如:group_to_update
)作为角色。无需提前在任何其他地方指定它。
这是它的工作原理。通常,在将散列大量分配给模型属性期间,所有模型的属性都用作指定散列的键。因此,如果您拥有Barn
模型和barn
实例,并且有三个属性horse
,cat
和rabbit
,那么:
barn.attributes = params
与做的基本相同:
barn.horse = params[:horse]
barn.cat = params[:cat]
barn.rabbit = params[:rabbit]
现在,如果您在barn模型上设置任何attr_accessible
,则在使用质量分配时,只会更新您在此处设置的属性。例如:
class Barn < ActiveRecord::Base
attr_accessible :cat
attr_accessible :rabbit
end
然后这个:
barn.attributes = params
只会这样做:
barn.cat = params[:cat]
barn.rabbit = params[:rabbit]
因为只有'猫'和'兔子'设置为可访问('马'不是)。现在考虑设置这样的属性角色:
class Barn < ActiveRecord::Base
attr_accessible :cat
attr_accessible :rabbit, :as => :banana
end
首先,请注意,角色可以通过您想要的任何内容,只要它是符号/字符串即可。在这种情况下,我创建了角色:banana
。现在,当您在attr_accessible
属性上设置角色时,通常不会分配该角色。这样:
barn.attributes = params
现在只会这样做:
barn.cat = params[:cat]
但您可以使用assign_attributes
方法为特定角色分配属性。所以你可以这样做:
barn.assign_attributes(params, :as => :banana)
这将分配所有正常保护的参数以及角色:banana
下受保护的所有参数:
barn.cat = params[:cat]
barn.rabbit = params[:rabbit]
因此,请考虑具有更多属性的更长示例:
class Barn < ActiveRecord::Base
attr_accessible :cat
attr_accessible :rabbit, :as => :banana
attr_accessible :horse, :as => :banana
attr_accessible :cow, :as => :happiness
end
然后,您可以在分配属性时使用这些角色。这样:
barn.assign_attributes(params, :as => :banana)
对应于:
barn.cat = params[:cat]
barn.rabbit = params[:rabbit]
barn.horse = params[:horse]
而且:
barn.assign_attributes(params, :as => :happiness)
对应于:
barn.cat = params[:cat]
barn.cow = params[:cow]
现在,如果您选择,您可以使用户角色(例如,用户模型上的“角色”列)对应于任何模型上的属性角色。所以你可以这样做:
barn.assign_attributes(params, :as => user.role)
如果这个user
的角色恰好是banana
,那么(使用我们的最后一个模型示例)它将在catn,rabbit和horse的barn上设置属性。但这只是使用属性角色的一种方法。如果你想以不同的方式使用它们,完全取决于你。
答案 1 :(得分:3)
这是为了防止你的链接解释的群发作业。
在rails(用于更新)中,这仅影响update_attributes调用。您仍然可以使用update_attribute或admin =方法分配管理变量。
User.first.update_attributes(:name => "Gazler", :admin => true) #this will not work
User.first.update_attribute(:admin, true) #This will work
#This will also work
user = User.first
user.admin = true
user.save
您可能需要查看使用gem for your permissions。 Cancan可能是最常见的。
答案 2 :(得分:1)
查看assign_attributes方法。
简而言之,它使您只有在传递角色时才能对属性进行签名。这些文档具有非常好且易于理解的代码示例。在某种程度上,它就像一种过滤器或防护。