эксперт по настройке рельсов

Я создал веб-приложение, используя рельсы 4.2.4, devise и каркас контактов, где пользователи могут использовать CRUD для булавки.

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

Я получаю множество таких ошибок>  введите описание изображения здесь

Факты:

У меня 2 модели pin.rb и user.rb

У меня есть pins_controller.rb

Я выполнил миграцию add_admin_to_users.rb (мне нужно дополнительное вмешательство в консоль, чтобы настроить что-то для администратора, кроме этого)

Могу ли я получить помощь по синтаксису и моему неудачному подходу

class ApplicationPolicy
  attr_reader :user, :pin

  def initialize(user, pin)
    raise Pundit::NotAuthorizedError, "must be logged in" unless user
    @user = user
    @pin = pin
  end

  def index?
    true
  end

  def show?
    scope.where(:id => record.id).exists?
  end

  def create?
    user.admin? 
  end

  def new?
    user.admin? 
  end

  def update?
    user.admin? 
  end

  def edit?
    update?
  end

  def destroy?
    user.admin? 
  end

  def scope
    Pundit.policy_scope!(user, record.class)
  end

  class Scope
    attr_reader :user, :scope

    def initialize(user, scope)
      @user = user
      @scope = scope
    end

    def resolve
      scope
    end
  end
end

Цитата

class PinsController < ApplicationController
  before_action :set_pin, only: [:show, :edit, :update, :destroy]
  before_action :correct_user, only: [:edit, :update, :destroy]
  before_action :authenticate_user!, except: [:index, :show]

  def index
    if params[:search].present? && !params[:search].nil?
      @pins = Pin.where("description LIKE ?", "%#{params[:search]}%").paginate(:page => params[:page], :per_page => 15)
    else
      @pins = Pin.all.order("created_at DESC").paginate(:page => params[:page], :per_page => 15)
    end
  end


  def show

  end


  def new
    @pin = current_user.pins.build
  end


  def edit
  end


  def create
    @pin = current_user.pins.build(pin_params)
    if @pin.save
      redirect_to @pin, notice: 'Pin was successfully created.'
    else
      render :new
    end
  end


  def update
    if @pin.update(pin_params)
      redirect_to @pin, notice: 'Pin was successfully updated.'
    else
      render :edit
    end
  end


  def destroy
    @pin.destroy
    redirect_to pins_url
  end


private
    # Use callbacks to share common setup or constraints between actions.
    def set_pin
      @pin = Pin.find_by(id: params[:id])
    end

    def correct_user
      @pin = current_user.pins.find_by(id: params[:id])
      redirect_to pins_path, notice: "Not authorized to edit this pin" if @pin.nil?
    end

    # Never trust parameters from the scary internet, only allow the white list through.
    def pin_params
      params.require(:pin).permit(:description, :image)
    end
end

Цитата

class ApplicationController < ActionController::Base
 include Pundit
 rescue_from Pundit::NotAuthorizedError, with: :user_not_authorized
 protect_from_forgery with: :exception
 before_filter :configure_permitted_parameters, if: :devise_controller?

 protected

 def configure_permitted_parameters
    devise_parameter_sanitizer.for(:sign_up) << :name
    devise_parameter_sanitizer.for(:account_update) << :name
 end

 private

 def user_not_authorized
   flash[:warning] = "You are not authorized to perform this action."
   redirect_to(request.referrer || root_path)
 end
end

person Chris Dormani    schedule 03.02.2016    source источник
comment
у вас есть PinPolicy класс? :)   -  person Andrey Deineko    schedule 03.02.2016
comment
Это то, что мне нужно в этом коде   -  person Chris Dormani    schedule 03.02.2016
comment
посмотри мой ответ пожалуйста   -  person Andrey Deineko    schedule 03.02.2016
comment
позвольте мне попробовать это сейчас, спасибо. скоро вернется, есть ли в моем коде что-то еще отсталое.   -  person Chris Dormani    schedule 03.02.2016


Ответы (1)


Ошибки возникают, скорее всего, просто из-за того, что, ну, как гласит исключение, нет класса PinPolicy. Помимо общего ApplicationPolicy, вы также должны определить политику для каждого ресурса (который наследуется от основного ApplicationPolicy).

Добавьте его в каталог /policies:

class PinPolicy < ApplicationPolicy
  class Scope < Scope
    def resolve
      return scope if user.admin?
      fail 'scope is not defined'
    end
  end
end
person Andrey Deineko    schedule 03.02.2016
comment
как мне закодировать это в политике приложения под инициализатором def или что-то в этом роде. Нужно ли мне удалить какой-либо код из моей политики выше - person Chris Dormani; 03.02.2016
comment
@ChrisDormani Создайте новый файл в app/policies с именем pin_policy.rb и поместите туда код, который я показал - person Andrey Deineko; 03.02.2016
comment
цените ваше время, попробую это на мгновение - person Chris Dormani; 03.02.2016
comment
и с точки зрения выполнения авторизации на пине для каждого ресурса (создание, обновление и т. д.) это будет называться authorize.pin или @ pin.authorize - person Chris Dormani; 03.02.2016
comment
@ChrisDormani, это сработало? Если да, подумайте о том, чтобы принять (отметьте галочкой слева от ответа) и, при желании, проголосовать за ответ. - person Andrey Deineko; 03.02.2016
comment
вернувшись в офис через 15 минут, разверну и проголосую - person Chris Dormani; 03.02.2016
comment
Хорошо, я создал новый файл, как вы рекомендовали. И вставил этот код. Под ним мне нужно создать def? user.admin? конец - person Chris Dormani; 03.02.2016
comment
Если вы посмотрите на мою политику приложений выше, они будут индексировать, показывать, создавать новые, обновлять. Мне нужно скопировать их в pin_policy.rb - person Chris Dormani; 03.02.2016
comment
@ChrisDormani нет, поскольку каждый метод, определенный в ApplicationPolicy, наследуется PinPolicy, поэтому он уже имеет этот create? метод, поскольку он определен в ApplicationPolicy - person Andrey Deineko; 03.02.2016
comment
Позвольте нам продолжить это обсуждение в чате. - person Chris Dormani; 03.02.2016