Использование CanCanCan - я явно делаю что-то явно неправильно - PullRequest
0 голосов
/ 26 апреля 2020

Добрый вечер,

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 %>

Подробнее чтение по официальной документации

1 Ответ

1 голос
/ 27 апреля 2020

С моей точки зрения:

  def initialize(user)
    user ||= ::User.new

    if user.new_record?
      can [:read, :search] ::List
    else
      can [:read, :comment], ::List
      can :manage, ::List, user_id: user.id
    end

Пробовал с этой статьей, источник

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...