Rails 6 mysubdomain.lvh.me перенаправил вас слишком много раз - PullRequest
2 голосов
/ 30 сентября 2019

Я создаю приложение rails 6 с поддоменами (своего рода мультитенантный подход, но без использования отдельных схем).

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

например,

член корпорации Hammer хочет войти в систему, он перейдет к hammer.lvh.me, когда этот запрос будет выполнен. Я хочу, чтобы мой фильтр before увидел, что запрос соответствуетСуществующий аккаунт и говорит Coolio и перенаправить их на соответствующую страницу входа. Если ни одна учетная запись не соответствует поддомену (т. Е. Опечатка), я хочу, чтобы они были перенаправлены на мою страницу root_url или регистрации.

У меня сейчас есть

def verify_account!
  if @account = Account.find_by(subdomain: request.subdomain).present?
    redirect_to login_url(subdomain: @account.subdomain)
  else
    redirect_to root_url(subdomain: nil)
  end
end

Когда я пытаюсь попасть на сайтс действительным поддоменом я действительно вижу, что он хочет перенаправить меня на страницу входа в URL, однако я получаю redirected you too many times в своем браузере.

Не слишком уверен, как действовать, чтобы исправить это? любая помощь будет отличной!

РЕДАКТИРОВАТЬ # 1 - Полный application_controller.rb

class ApplicationController < ActionController::Base
  before_action :configure_permitted_parameters, if: :devise_controller?
  before_action :verify_account!
  # before_action :set_account

  def after_sign_in_path_for(resource)
    stored_location_for(resource) || dashboard_path
  end

  def after_sign_out_path_for(resource)
    root_path
  end

  private

    def verify_account!
      if @account = Account.find_by(subdomain: request.subdomain).present?
        redirect_to login_url(subdomain: @account.subdomain)
      else
        redirect_to root_url(subdomain: nil)
      end
    end

    # def require_account!
      # redirect_to root_url(subdomain: nil) if !@account.present?
      # flash[:error] = "An account is required to access this page. Please sign up or proceed to your_company.loadze.co to login"
    # end

    def set_account
      @account = Account.find_by(subdomain: request.subdomain)
      # byebug
    end

    def configure_permitted_parameters
      devise_parameter_sanitizer.permit(:sign_up, keys: [:f_name, :l_name, account_attributes: [:company_name]])
    end

end

РЕДАКТИРОВАНИЕ # 2: Добавляет вывод сервера

Started GET "/login" for 127.0.0.1 at 2019-09-30 04:29:16 -0600
Processing by Devise::SessionsController#new as HTML
  Account Load (0.2ms)  SELECT "accounts".* FROM "accounts" WHERE "accounts"."subdomain" = $1 LIMIT $2  [["subdomain", "tauren_group"], ["LIMIT", 1]]
  ↳ app/controllers/application_controller.rb:17:in `verify_account!'
Redirected to http://tauren_group.lvh.me:3000/login
Filter chain halted as :verify_account! rendered or redirected
Completed 302 Found in 2ms (ActiveRecord: 0.2ms | Allocations: 865)

1 Ответ

1 голос
/ 30 сентября 2019

Когда приложение перенаправляется на экран входа в систему, оно перенаправляется снова, потому что оно снова входит в блок if. Попробуйте это:

def verify_account!
  if @account = Account.find_by(subdomain: request.subdomain).present?
    return if request.url == login_url(subdomain: @account.subdomain)

    redirect_to login_url(subdomain: @account.subdomain)
  else
    redirect_to root_url(subdomain: nil)
  end
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...