2011-01-15 94 views
0


我不太明白如何限制在CanCan的特定情況下訪問鏈接。我總是會顯示「編輯」鏈接。 所以我相信問題是在我cancan方法(load_和authorize_)的不正確的定義。 我有CommentsController這樣的:CanCan多態資源訪問問題

class CommentsController < ApplicationController 
    before_filter :authenticate_user! 
    load_resource :instance_name => :commentable 
    authorize_resource :article 
    def index 
    @commentable = find_commentable #loading our generic object 
    end 

...... 

    private 

    def find_commentable    
    params.each { |name, value| 
     if name =~ /(.+)_id$/ 
     return $1.classify.constantize.includes(:comments => :karma).find(value) 
     end } 
    end 
end 

和我在從其他控制器渲染文件代碼有註釋/ index.html.erb:

<%= render :file => "#{get_commentable_partial_name(@commentable)}/show.html.erb", :collection => @commentable %> 

你可以考慮一下「#{get_commentable_partial_name( @commentable)}「在這種情況下就像」文章「一樣。 內容 「的文章/ show.html.erb」 的:

<% if can? :update, @commentable %> 
    <%= link_to 'Edit', edit_article_path(@commentable) %> | 
<% end %> 

我ability.rb:

class Ability 
    include CanCan::Ability 

    def initialize(user) 
    user ||= User.new # guest user 

    if user.role? :admin 
     can :manage, :all 
    elsif user.role? :author 
     can :read, [Article, Comment, Profile] 
     can :update, Article, :user_id => user.id 
    end 
    end 
end 

我曾嘗試調試這個問題就像

user = User.first 
article = Article.first 
ability = Ability.new(user) 
ability.can?(:update, article) 

,我總是在能力檢查中得到「=> true」

注意:user.role == author和article.user_id!= user.id

,如果您需要了解更多信息,請寫

感謝的您的時間& &對不起,我的英語

回答

0

好吧,我算起來,重新確定在ability.rb所以現在爲了規則就像是guest->作者 - >版主 - >管理員和問題解決。我相信問題的根源在於康康邏輯,它假定我需要重新定義規則或按照我之前展示的順序執行此操作