Nano Hash - криптовалюты, майнинг, программирование

Роли Ruby on Rails для пользователей

У меня следующая проблема. Я пишу авторизацию с нуля с помощью учебника. Но в этом руководстве роль пользователя имеет логический тип. Моя модель user_role имеет строковый тип. Я хочу сделать так, чтобы, если у вас есть user_role == 'admin', вы могли получить доступ везде. Если у вас есть user_role == 'user', вы можете просто получить доступ только к показу действий и индексу.

Я добавил к модели следующее кодовое имя файла:

разрешение.rb

class Permission < Struct.new(:user)

  def allow?(controller, action)
    if user.user_role == "user"
    controller == "posts" && action.in? == (%w[index show])
  elsif user.user_role == "admin"
      true
    end
  end
end

и когда я нажимаю изменить на своей странице, это дает мне ошибку:

NoMethodError в PostsController#edit неопределенный метод `user_role' для nil:NilClass

Как я могу это решить?

Часть моей модели

  create_table "posts", force: :cascade do |t|
    t.string "title"
    t.text "content"
    t.boolean "read"
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
    t.date "creation_date"
    t.string "author"
    t.integer "user_id"
  end

  create_table "users", force: :cascade do |t|
    t.string "email", default: "", null: false
    t.string "encrypted_password", default: "", null: false
    t.string "reset_password_token"
    t.datetime "reset_password_sent_at"
    t.datetime "remember_created_at"
    t.integer "sign_in_count", default: 0, null: false
    t.datetime "current_sign_in_at"
    t.datetime "last_sign_in_at"
    t.string "current_sign_in_ip"
    t.string "last_sign_in_ip"
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
    t.string "user_role"
    t.index ["email"], name: "index_users_on_email", unique: true
    t.index ["reset_password_token"], name: "index_users_on_reset_password_token", unique: true
  end

Мой контроллер приложений

class ApplicationController < ActionController::Base
  protect_from_forgery with: :exception
  before_action :authorize, only: [:new, :edit, :update, :destroy, :update ]

#  def after_sign_in_path_for(resource)
#    app_dashboard_index_path
#end
private

def current_user
  @current_user ||= User.find(session[:user_id]) if session[:user_id]
  end
end


def current_permission
  @current_permission ||= Permission.new(current_user)
end

def authorize
  if !current_permission.allow?(params[:controller], params[:action])
    redirect_to posts_path, alert: "Not authorized"
  end
end

МОЙ пост-контроллер

class PostsController < ApplicationController
  before_action :find_post, only: [:show, :edit, :update, :destroy]
  before_action :authorize, only: [:new, :edit, :update, :destroy, :update ]


  def index
    @posts = Post.all
  end

  def edit
  end

  def new
    @post =  current_user.posts.new
  end

  def show
  end

  def update
    if @post.update_attributes(post_params)
      flash[:notice] = "Data has hanged"
      redirect_to post_path
    else
      render action 'edit'
    end
  end

  def destroy
    @post.destroy
    redirect_to posts_path
  end

  def create
    @post = current_user.posts.build(post_params)

    if @post.save
      redirect_to @post
    else
      render 'index'
    end
  end

private

def find_post
  @post = Post.find(params[:id])
end

def post_params
  params.require(:post).permit(:title, :content, :read, :author)
end


end

(Раньше я пытался написать авторизацию с помощью gem CanCanCan и Pundit, но я не понял, как это работает, поэтому удалил их из проекта).


Ответы:


1
NoMethodError in PostsController#edit undefined method `user_role' for nil:NilClass

Это означает, что вы пытаетесь вызвать «user_role» для объекта, и этот объект равен нулю, хотя этого быть не должно. Я предполагаю, что в вашем классе разрешений он не был определен пользователем. В любом случае я бы подошел к этому по-другому:

class PostsController < ActionController::Base
  protect_from_forgery with: :exception
  before_action :authorize, skip: [:show, :index]

  def authorize
    return if current_user && current_user.user_role == 'admin'
    redirect_to posts_path, alert: 'You are not allowed to access this part of the site'
  end
end

Это вызовет метод авторизации в каждом действии контроллера сообщений, кроме show и index.

Если пользователь вошел в систему и его user_role — «admin», метод вернется и ничего не сделает. В противном случае он будет перенаправлен на путь сообщений.

02.11.2017
Новые материалы

Кластеризация: более глубокий взгляд
Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

Как написать эффективное резюме
Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

Частный метод Python: улучшение инкапсуляции и безопасности
Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

Как я автоматизирую тестирование с помощью Jest
Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..