2012-02-07 90 views
2

当用户不是某个角色时,我需要隐藏表单中的某些表单域。这怎么可能完成?从文档我知道你可以访问某些行为,如显示,更新或只是管理根据角色隐藏或显示CanCan的内容?

但如何做一些事情,如果user.role? :admin

回答

4
if cannot? :manage ,Articles 
    flash[:notice] = "you are not authorized to manage articles" 

    end 
+0

问题我有一个配置文件控制器,只想限制访问表单字段的一部分,所以一个完整的用户会得到更多的表单字段(它的搜索表单)我不明白我怎么可以用CanCan做到这一点在这个设置 – Rubytastic 2012-02-07 20:10:49

+0

这对我有效 – Rubytastic 2012-09-18 11:32:54

2

这个答案主要是从CanCan documentation复制。

首先,你定义一个Ability class。您可以生成这些使用中的一种:

rails g cancan:ability 

这应该给你这样的:

class Ability 
    include CanCan::Ability 

    def initialize(user) 
    user ||= User.new # guest user (not logged in) 
    if user.admin? 
     can :manage, :all 
    else 
     can :read, :all 
    end 
    end 
end 

在这个类你可以定义你希望用户拥有的任何能力。在上面的例子中,管理员可以管理任何对象。不是管理员或未登录的用户可以读取任何对象。

定义你的能力后,你需要使用can?方法check your abilities。在你看来,你可以写这样的:

<% if can? :create, Project %> 
    <!-- your form view logic goes here --> 
<% end %> 
+0

抛出一个未定义的方法'的角色“?我从配置文件控制器partial(不是集合部分)内部调用它,这很奇怪,它给出了未定义的方法。角色是在属性访问和角色系统在所有其他地方工作正常,只是我不能得到这个如果声明工作 – Rubytastic 2012-02-07 20:09:24

+0

我想他的意思是你应该把一个角色?方法在你的用户模型上,并简单地检查,就像你通常没有康康舞 – Tigraine 2012-02-07 20:12:08

+0

我的答案应该被视为你在显示你的表单中调用。我正在更新我的答案。 – LandonSchropp 2012-02-07 21:58:57

4

如果你想做到这一点通过康康舞它都将取决于你如何拥有自己的能力建立。考虑到这一点,如果用户有充分的权限,你可以使用:

<% if can? :manage, :all %> 
    <%= f.text_field :field_name %> 
<% end % > 

否则,你可以更具体,并指定一个基础模型/动作,用户需要有权限才能像现在这样:

<% if can? :update , Profile %> 
    <%= f.text_field :field_name %> 
<% end % > 
2

您可以使用:

<% if user.admin? %> 
    <!-- form field --> 
<% elsif user.editor? %> 
    <!-- another form field --> 
<% end %>