Контроллер RoR - Разрешение для определенной роли

Я совершенно новичок в Ruby on Rails, и я застрял с предоставлением разрешений для определенных ролей. Я создал 8 разных ролей с перечислением. 2 из них должны быть разрешены для создания некоторых «кейсов». Как я могу это реализовать? Может быть, кто-нибудь может мне помочь? Правильно ли давать разрешение?

PS: я использую Rails 6.0.3.4.

Вот мой код:

Контроллер дел:

    class CasesController < ApplicationController
  before_action :set_case, only: [:show, :edit, :update, :destroy]

  # GET /cases
  # GET /cases.json
  def index
    @cases = Case.all
  end

  # GET /cases/1
  # GET /cases/1.json
  def show
  end

  # GET /cases/new
  def new
    @case = Case.new
  end

  # GET /cases/1/edit
  def edit
  end

  # POST /cases
  # POST /cases.json
  def create
    @case = Case.new(case_params)

    respond_to do |format|
      if @case.save
        format.html { redirect_to @case, notice: 'Case was successfully created.' }
        format.json { render :show, status: :created, location: @case }
      else
        format.html { render :new }
        format.json { render json: @case.errors, status: :unprocessable_entity }
      end
    end
  end

  # PATCH/PUT /cases/1
  # PATCH/PUT /cases/1.json
  def update
    respond_to do |format|
      if @case.update(case_params)
        format.html { redirect_to @case, notice: 'Case was successfully updated.' }
        format.json { render :show, status: :ok, location: @case }
      else
        format.html { render :edit }
        format.json { render json: @case.errors, status: :unprocessable_entity }
      end
    end
  end

  # DELETE /cases/1
  # DELETE /cases/1.json
  def destroy
    @case.destroy
    respond_to do |format|
      format.html { redirect_to cases_url, notice: 'Case was successfully destroyed.' }
      format.json { head :no_content }
    end
  end

  private
    # Use callbacks to share common setup or constraints between actions.
    def set_case
      @case = Case.find(params[:id])
    end

    # Only allow a list of trusted parameters through.
    def case_params
      params.require(:case).permit(:first_name, :last_name, :gender, :birthdate, :place_of_residence, :diagnosis, :user_id, :confirmed_at)
    end
end

Контроллер приложений:

    class ApplicationController < ActionController::Base
before_action :authenticate_user!

end

Пользователь.rb

  class User < ApplicationRecord
  enum role: [:user, :vip, :admin, :arzt, :labor, :ga, :ls, :rki]
  after_initialize :set_default_role, if: :new_record?

   def set_default_role
     self.role ||= :user
   end

  # Include default devise modules. Others available are:
  # :confirmable, :lockable, :timeoutable, :trackable and :omniauthable
  devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :validatable
end

Это довольно много кода. Пожалуйста, прочитайте Как создать минимальный воспроизводимый пример

Tomer Shetah 14.12.2020 19:57

Спасибо за ваш совет! В следующий раз буду иметь в виду. Простите за это!

Cookieholik 15.12.2020 00:34
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
2
90
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Самое простое решение может быть перед действием...

CasesController << ApplicationController

  before_action :allowed_to_create, only: [:new, :create]

  private

  def allowed_to_create
    unless current_user.role.in?(['type1', 'type2'])
      flash[:error] = 'You are not allowed to do that'
      redirect_to root_path
    end
  end
end 

Если ваши разрешения, вероятно, будут более сложными, взгляните на жемчужину cancancan.

Спасибо!!! Это должно быть идеальным решением для меня. Роли «арзт» и «труд» должны быть в состоянии создавать некоторые кейсы. Поэтому я сделал это так: class CasesController < ApplicationController before_action :set_case, only: [:show, :edit, :update, :destroy] before_action :allowed_to_create, only: [:new, :create] private def allowed_to_create unless current_user.role.in?(['arzt', 'labor']) redirect_to root_path end end ... Когда я вхожу в систему как «arzt» или «labor», к сожалению, я получаю следующую ошибку:

Cookieholik 14.12.2020 16:00

Ошибка аргумента в случаях # новая строка № 1 поднята: первый аргумент в форме не может содержать nil или быть пустым. Извлеченный источник (вокруг строки № 1): <%= form_for @case do |form| %> <% if @case.errors.any? %> <div id = "error_explanation"> <h2><%= pluralize(@case.errors.count, "error") %> prohibited this case from being saved:</h2> <ul> <% @case.errors.full_messages.each do |message| %> <li><%= message %></li> <% end %> </ul> </div> <% end %> <div class = "field"> ... Знаете почему?

Cookieholik 14.12.2020 16:04

Эм... нет, я не знаю. Вы явно визуализируете new, а в new вы устанавливаете @case = Case.new, поэтому я не уверен, почему @case в форме равен нулю. В качестве эксперимента создайте эту строку в форме непосредственно перед строкой form_for... <% @case ||= Case.new %> и посмотрите, что получится...

SteveTurczyn 14.12.2020 21:19

Спасибо за помощь! :)

Cookieholik 15.12.2020 00:32

Другие вопросы по теме