CanCanCan load_and_authorize_resource - PullRequest
       134

CanCanCan load_and_authorize_resource

0 голосов
/ 23 декабря 2019

У меня два вопроса в 1:

  1. load_and_authorize_resource не работает в моем контроллере Pokemon. Если я понимаю, что документация load_and_authorize_resource должна препятствовать пользователю посещать маршрут / действие, к которому у него нет прав доступа. Вот код для контроллера:
class PokemonsController < ApplicationController
  load_and_authorize_resource

  def update
    if @pokemon.update_attributes(pokemon_params)
      flash[:success] = 'Pokemon was updated!'
      redirect_to root_path
    else
      render 'edit'
    end
  end


  def create
    @pokemon = Pokemon.new(pokemon_params)
    @pokemon.user_id = current_user.id
    @pokemon.trainer_id = Trainer.first.id

    if @pokemon.save
      flash[:success] = "Nice job! #{@pokemon.name} was created!"
      redirect_to pokemons_path
    else
      flash[:danger] = "Hmmm try that again."
      render :new
    end
  end

  def show
    @pokemon = Pokemon.find_by_slug(params[:slug])
  end

  def destroy
    if @pokemon.destroy
      flash[:success] = 'Congrats, you destroyed a pokemon?'
    else
      flash[:warning] = 'I couldnt destroy this pokemon...'
    end
    redirect_to root_path
  end

  private

  def pokemon_params
    params.require(:pokemon).permit(
      :name,
      :pkmn_type,
      :level,
      :attack,
      :defense, 
      :speed, 
      :pokedex, 
      :sp_attack, 
      :sp_defense
    )
  end

end


А вот модель ability.rb:

class Ability
  include CanCan::Ability

  def initialize(user)
      user ||= User.new # guest user (not logged in)
      if user.admin?
        can :manage, :all
      else
        can :manage, Pokemon, user_id: user.id
        can :read, :all
      end
  end
end

Я вышел из приложения, поэтому current_user отсутствует/ сеанс доступен, но я все еще могу посетить представление редактирования для покемона. Любая идея, что происходит?

Вопрос 2: Как мне отладить это для дальнейшего использования?

Вот ссылка на репо , если это вообще поможет,Заранее спасибо?

1 Ответ

1 голос
/ 23 декабря 2019

Я скачал ваше репо. Прежде всего, ваша страница регистрации не работает должным образом. Здесь нет обязательных полей имени / фамилии. Я думаю, что вы можете справиться с ними в будущем. Что касается вашего вопроса, cancancan отлично работает, когда я изменил ваши маршруты слагов на маршруты по умолчанию. Вот ошибка, когда я попытался отредактировать покемона, который принадлежит другому пользователю:

CanCan::AccessDenied - You are not authorized to access this page.:
Started GET "/pokemons/2/..." for ::1 at 2019-12-23 11:27:37 +0200

Когда я вернул слаг, это нарушает это поведение, и я могу редактировать всех покемонов. Так что проблема не в CanCanCan, а в конфигурации слагов. Если вы не хотите менять маршруты по умолчанию или использовать FriendlyId , я рекомендую вам использовать такие действия контроллеров, как:

  def edit
    @pokemon = Pokemon.find_by_slug(params[:slug])
    authorize! :edit, @pokemon
  end

ПРИМЕЧАНИЕ: вы должны удалить строкуload_and_authorize_resource

Эта конфигурация также возвращает правильную ошибку при попытке редактировать покемона, который не принадлежит пользователю:

enter image description here

Надеюсь, я немного помог.

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