CanCan проблема полиморфного доступа к ресурсам - PullRequest
0 голосов
/ 15 января 2011


Я не совсем понимаю, как ограничить доступ к ссылкам в данном конкретном случае с CanCan. У меня всегда отображается ссылка «Изменить». Поэтому я считаю, что проблема в моем неправильном определении методов cancan (load_ and authorize_) - . У меня есть КомментарииКонтроллер, как это:

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)}" как о просто "статьях". Содержимое "article / show.html.erb":

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

мои способности.рб:

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

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

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

1 Ответ

0 голосов
/ 18 января 2011

Ладно, я разобрался, переопределил правила в способности. Так что теперь порядок такой, как «гость» - «автор» - «модератор» - «администратор» и проблема решена. Я полагаю, что корень проблемы был в канканской логике, которая предполагает, что мне нужно переопределить правила или сделать это в порядке, который я показал до

...