Проблема доступа к полиморфным ресурсам CanCan


я не совсем понимаю, как ограничить доступ к ссылкам в данном конкретном случае с помощью CanCan. У меня всегда отображается ссылка "Редактировать". Поэтому я считаю, что проблема в моем неправильном определении методов канкана (загрузка_ и авторизация_). У меня есть CommentController вот так:

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

и у меня есть в comment/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)

и я всегда получаю "=> true" в проверке способностей

Примечание: user.role == автор и article.user_id != user.id

если вам нужна дополнительная информация, пожалуйста, напишите

спасибо за ваше время && извините за мой английский


person Call 'naive' True    schedule 15.01.2011    source источник


Ответы (1)


хорошо, я разобрался, переопределил правила в Ability.rb, так что теперь порядок такой как гость->автор->модератор->админ и проблема решена. Я считаю, что корень проблемы был в логике канкана, которая предполагает, что мне нужно переопределить правила или сделать это в том порядке, в котором я показывал раньше.

person Call 'naive' True    schedule 18.01.2011