Добрый вечер,
CanCanCan великолепен; тем не менее, я думаю, что упускаю что-то невероятно очевидное, поскольку моя модель Logi c довольно проста.
- Зарегистрированный пользователь , который произвел вещь , должен иметь возможность читать, обновлять и удалять
- Если зарегистрированный пользователь не автор вещи должен уметь читать и комментировать вещь.
- Кто-то, кто не вошел в систему, должен уметь читать и / или искать.
Шаги 1 и 3 работают , Тем не менее, шаг 2 не работает - если другой пользователь вошел в систему, пытается посмотреть на вещи; они видят «CanCan :: AccessDenied», если это не их вещь.
Ability.rb
if user.present?
can :manage, List, user_id: user.id
else
can [:read, :search], List
end
Связан ли / 1022 * с current_user в приведенном выше фрагменте? Я пытался пропустить .present? Тем не менее, это по-прежнему визуализирует CanCan :: AccessDenied.
После этой неожиданной ошибки я подумал, что что-то вроде ниже будет работать, увы нет.
if user.present?
can :manage, List, user_id: user.id
elsif @list.find(params[:id]).user != user
can [:read], List
else
can [:read, :search], List
end
Для потомков, пожалуйста, найдите мое решение, основанное на том, что предоставил Роман Алексеев.
контроллер приложения
class ApplicationController < ActionController::Base
load_and_authorize_resource :parent
load_and_authorize_resource :child, through: :parent
способность.rb
class Ability
include CanCan::Ability
def initialize(user)
user ||= ::User.new
if user.new_record?
can [:read, :search], Parent
can [:read], Child
else
can [:read, :search], ::Parent
can [:read, :create, :delete], Child
can :manage, Parent, user_id: user.id
end
end
Как использовать способность в представлении, например, шоу.
<% if can? :create, @parent => Child %>
present the child markup/content
<% end %>
Подробнее чтение по официальной документации