Я совершенно новичок в 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
Спасибо за ваш совет! В следующий раз буду иметь в виду. Простите за это!
Самое простое решение может быть перед действием...
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», к сожалению, я получаю следующую ошибку:
Ошибка аргумента в случаях # новая строка № 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">
... Знаете почему?
Эм... нет, я не знаю. Вы явно визуализируете new
, а в new
вы устанавливаете @case = Case.new
, поэтому я не уверен, почему @case
в форме равен нулю. В качестве эксперимента создайте эту строку в форме непосредственно перед строкой form_for
... <% @case ||= Case.new %>
и посмотрите, что получится...
Спасибо за помощь! :)
Это довольно много кода. Пожалуйста, прочитайте Как создать минимальный воспроизводимый пример