2012-02-07 99 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 %>