Проблема доступа к полиморфическим ресурсам канкана
-
11-10-2019 - |
Вопрос
Я не совсем понимаю, как ограничить доступ к ссылкам в данном конкретном случае с Cancan. Я всегда получаю отображение ссылки «Редактировать». Так что я верю Проблема есть В моем неправильном определении методов канкана (Load_ и Authorize_). У меня есть комментарии Controller
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 %>
my ebility.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 == Автор и статья.user_id! = User.id
Если вам нужна дополнительная информация, напишите
Спасибо за ваше время и извините за мой английский
Решение
Хорошо, я выясняю это, переосмысливали правила в ofment.rb, так что теперь заказ похож на гость-> Автор-> Модератор-> Админ, и проблема решается. Я считаю, что корень проблемы был в логике Cancan, которая предполагает, что мне нужно переопределить правила или сделать это, чтобы показать раньше