CanCan多态资源访问问题

时间:2011-01-15 16:43:24

标签: ruby-on-rails-3 polymorphic-associations cancan


我不太明白如何在CanCan的这种特殊情况下限制对链接的访问。我总是显示“编辑”链接。 所以我认为问题在我对cancan方法(load_和authorize_)的错误定义中。 我有这样的CommentsController:

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

我在comments / index.html.erb中跟随从其他控制器渲染文件的代码:

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

在这种情况下,您可以考虑“#{get_commentable_partial_name(@commentable)}”,就像“文章”一样。 “articles / show.html.erb”的内容:

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

我的能力.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)

我在能力检查中总是得到“=&gt; true”

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

如果您需要更多信息,请写下

谢谢您的时间和&amp;&amp;对不起我的英文

1 个答案:

答案 0 :(得分:0)

好吧我明白了,重新确定了ability.rb中的规则,所以现在订单就像是guest-gt; author-&gt; moderator-&gt; admin并且问题解决了。我相信问题的根源在于康卡尔逻辑,它假定我需要重新定义规则或按照我之前显示的顺序执行