Arhn - архитектура программирования

маршруты / after_sign_in_path_for не работают в продакшене (Rails 5.1)

Я только что обновил свое приложение, чтобы перенаправить пользователя после входа в систему на основе его роли пользователя.

Например, если user.role == "admin", он должен перейти к admin_root_path...

и если user.role == "customer", он должен перейти к portal_root_path.

По какой-то причине это работает на РАЗРАБОТКЕ, но когда я тестировал на ПРОДУКЦИИ, это дало мне ошибку, пытаясь все время перенаправить на admin_root_path, я входил в систему с пользователем «клиент». Это ошибка на PRODUCTION сервере.

Processing by AdminController#index as HTML Completed 401 Unauthorized in 0ms (ActiveRecord: 0.0ms)

(К вашему сведению) root_path для приложения по-прежнему root: «admin#index», с before_action :authenticate_user! на контроллере приложений...

Здесь я создал корневые пути в файле маршрутов:

Rails.application.routes.draw do
  get "admin/index"

  scope :portal, as: 'portal' do
    root to: "portal#index"
  end

  scope :admin, as: 'admin' do
    root to: "admin#index"
  end

  root to: "admin#index"
end

Это мой application_controller.rb

class ApplicationController < ActionController::Base
  include Pundit
  protect_from_forgery with: :exception, prepend: true
  before_action :authenticate_user!

  def after_sign_in_path_for(resource)
    if resource.role == "admin"
      admin_root_path
    elsif resource.role == "customer"
      portal_root_path
    else
      super
    end
  end

  rescue_from Pundit::NotAuthorizedError, with: :user_not_authorized

  private

  def user_not_authorized
    flash[:alert] = "You are not authorized to perform this action."
    redirect_to(request.referrer || portal_root_path)
  end
end

Есть рекомендации? Есть идеи, почему он ведет себя по-разному в средах DEV и PRODUCTION?

-- РЕДАКТИРОВАТЬ Это мой PortalController, представление использует переменную @customer для отображения информации о клиенте.

class PortalController < ApplicationController
before_action :set_customer

def index
end

private

# Use callbacks to share common setup or constraints between actions.
def set_customer
  @customer = Customer.friendly.find(current_user.customer_id)
end

конец

Большое спасибо!

20.08.2018

  • Я думаю, что root обрабатывается по умолчанию, и, поскольку вы говорите root to: admin#index в конце, он переопределяет все вышеперечисленные маршруты. Это только мое предположение, хотя я никогда не определял маршруты таким образом. 21.08.2018

Ответы:


1

Можете ли вы попробовать изменить свои маршруты, чтобы они выглядели так?

scope :portal do
  resources :portals, only: :index
  // if you don't want to use resources, just define a static route
end

scope :admin do
  resources :admins, only: :index
  // if you don't want to use resources, just define a static route
end
21.08.2018
  • Спасибо, что нашли время ответить. Я снова проверил на производстве (он работает в разработке), и кажется, что after_sign_in_path работает правильно, поскольку он направляет к администратору (если пользователь является администратором) и к /portal (если пользователь является клиентом). Маршруты администратора работают правильно, но портал разрывы индекса в Production... (Страница, которую вы искали, не существует)... Я не понимаю, почему, поскольку у меня есть и контроллеры, и индексные страницы, структурированные одинаково. Я запущу производственную среду локально, чтобы посмотреть, смогу ли я получить более качественные журналы... 21.08.2018
  • До сих пор я думаю, что это связано с моим PortalController, который как функция set_customer может действовать по-разному на производстве. Функция такова: def set_customer @customer = Customer.friendly.find(current_user.customer_id) end 21.08.2018
  • Я только что добавил PortalController в исходный пост (отредактировал)... Спасибо! 23.08.2018
  • Новые материалы

    Коллекции публикаций по глубокому обучению
    Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

    Представляем: Pepita
    Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

    Советы по коду Laravel #2
    1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

    Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
    Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

    3 способа решить квадратное уравнение (3-й мой любимый) -
    1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

    Создание VR-миров с A-Frame
    Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

    Демистификация рекурсии
    КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..