#ruby-on-rails #multi-tenant #apartment-gem
Вопрос:
Я прочитал все вопросы, которые смог найти здесь, и все еще не мог заставить это работать. Я использую рельсы 6 и драгоценный камень ros/квартира. У меня есть удаленная форма, в которой пользователь вводит свой поддомен. Отправив его, вы должны перенаправить его на корневую страницу поддомена, но этого не происходит.
конфигурация/маршруты.rb
class SubdomainBlank
def self.matches?(request)
request.subdomain.blank?
end
end
class SubdomainPresent
def self.matches?(request)
request.subdomain.present?
end
end
Rails.application.routes.draw do
constraints(SubdomainBlank) do
root 'landing_page#index'
as :account do
get 'sign_up', to: 'accounts#new'
post 'sign_up', to: 'accounts#create'
get 'sign_in', to: 'accounts#sign_in'
post 'sign_in', to: 'accounts#set_tenant'
end
end
constraints(SubdomainPresent) do
root 'home#index', as: :subdomain_root
devise_for :users,
controllers: { invitations: 'users/invitations' }
end
end
приложение/просмотры/учетные записи/sign_in.html.erb
<%= form_with(url: sign_in_path, method: :post) do |f| %>
<div class="input-group mb-3">
<%= f.text_field :subdomain, autofocus: true, class: 'form-control', placeholder: 'Enter your subdomain' %>
<span class="input-group-text" id="basic-addon2">.keepthemposted.com</span>
</div>
<%= f.submit "Proceed", url: sign_in_path, method: :post, class:"btn btn-primary btn-user btn-block", data: { disable_with: "Lookin for account..." } %>
<% end %>
приложение/контроллеры/accounts_controller.rb
class AccountsController < ApplicationController
layout 'account'
# skip_before_action :authenticate_user, only: %i[new create]
def new
@account = Account.new
@account.build_owner
end
def create
ActiveRecord::Base.transaction do
@account = Account.new(account_params)
unless @account.valid?
respond_with(broadcast_errors(@account, account_params))
return
end
Apartment::Tenant.create(@account.subdomain)
Apartment::Tenant.switch!(@account.subdomain)
unless @account.save!
respond_with(broadcast_errors(@account, account_params))
return
end
redirect_to new_user_session_path(subdomain: "#{@account.subdomain}.lvh.me")
# redirect_to home_index_path
rescue StandardError
# respond_with(broadcast_errors(@account, account_params))
end
end
def set_tenant
if params[:subdomain].blank?
flash.now[:notice] = 'Enter your subdomain'
return
end
account = Account.find_by(subdomain: params[:subdomain])
if account.nil?
flash.now[:notice] = "We couldn't find #{params[:subdomain]}.keepthemposted.com"
return
end
render js: "window.location='#{subdomain_root_path(subdomain: account.subdomain)}'"
end
end
Я думаю, это может быть что-то с localhost, верно? Но как я мог заставить его работать как на производстве, так и на локальном хостинге? Или это что-то другое?