Ошибка передачи условий в методе удаления пользователя - PullRequest
0 голосов
/ 02 апреля 2020

Я создал метод для удаления пользователя. Суть проверки заключается в том, что пользователь может удалить только свою учетную запись, или администратор может это сделать. Однако, когда вы пытаетесь удалить свою учетную запись для пользователя, появляется сообщение «У вас нет прав для этого» * ​​1001 *

def destroy
    if @user.present? && (current_user.id == @user.id || current_user.admin?)
      @user.destroy
      respond_to do |format|
       format.html { redirect_to root_path, notice: t(:destroy) }
      end
    else
     respond_to do |format|
       format.html { redirect_to root_path, notice: t(:permission_error) }
     end
    end
  end

1 Ответ

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

Действительно способ справиться с этим - использовать before_action для предисловия к действию (или использовать Pundit вместо изобретения колеса), чтобы вы не дублировали логи авторизации c повсюду.

# app/errors/authorization_error.rb
class AuthorizationError < StandardError; end
class ApplicationController < ActionController::Base
  rescue_from 'AuthorizationError', with: :deny_access

  private 

  def deny_access
    respond_to do |format|
      format.html { redirect_to root_path, notice: t(:permission_error) }
      format.json { head :unauthorized }
    end
  end
end
class UsersController < ApplicationController
  before_action :set_user, only: [:show, :edit, :update, :destroy]
  before_action :authorize_user!, only: [:edit, :update, :destroy]

  def destroy
    # much dry - such wow
    @user.destroy
    respond_to do |format|
      format.html { redirect_to root_path, notice: t(:destroy) }
    end
  end

  private

  def set_user
    # Don't worry - this will raise an error if the user is not found
    @user = User.find(params[:id]) 
  end

  def authorize_user!
    unless @user == current_user || current_user.admin?
      raise AuthorizationError 
    end
  end
end
...