2014-11-02 118 views
0

所以我有一個Post模型。我的posts可以發佈或不發佈。我正在使用Rolify,CanCanCan和Devise。如何限制特定範圍僅限具有特定角色的用戶?

我希望發生什麼是我的:admin的用戶,應該能夠查看所有帖子的Post#Show動作,但我:memberguest用戶(即非登錄)應該永遠只能夠看到Post.published職位。

ability.rb看起來是這樣的:

if user.has_role? :admin 
     can :manage, :all 
    #Member 
    elsif user.has_role? :member 
     can :read, :all 
     can :create, Post 
     can :status, Post 
     can :update, Post do |post| 
      post.try(:user) == user 
     end 
    #Guest 
    else 
     can :read, :all 
     can :create, Post 
     can :status, Post 
    end 

我試着這樣做,對於:memberGuest,但它給了我Post#Index頁上的無限重定向循環 - 這是我root_path

can :read, Post.published 

其中Post.published返回publication_status = "published"所有帖子的數組。

這是我宣佈,我Post.rb

enum publication_status: [ :unpublished, :published ] 

如何實現這一目標?

回答

0

我想通了。

在我Post#Show,我只是這樣做:

def show 
    if current_user and current_user.has_role? :admin or :editor 
     @post = Post.find(params[:id]) 
    else 
     @post = Post.published.find(params[:id]) 
    end 
    end 

這就像一個魅力。

如果有人有一個更優雅的方式,說我想知道ability.rb

我在ability.rb中嘗試了很多使用塊和所有這些爵士樂的排列,但沒有任何成效。

我還不得不在我的控制器中刪除默認添加的set_post方法,因爲cancancan已經是loads_and_authorize的資源。

0

請嘗試以下

#Member 
elsif user.has_role? :member 
    can :read, Post, publication_status: :published 
    can :create, Post 
    can :status, Post 
    can :update, Post, user_id: user.id 
# same goes for the Guest user 

這將工作給您在Post模型有一個名爲publication_status

相關問題