Действительно способ справиться с этим - использовать 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