Jedna poddomena na użytkownika to dość powszechny przypadek użycia w tworzeniu aplikacji internetowych. Oto w jaki sposób można to zrobić:
pierwsze: zapewnienia bezpieczeństwa Users table
ma :name column
(myślę Devise robi to domyślnie - jeśli nie można uruchomić rails g migration AddNameToUsers name:string
dodać tę kolumnę do bazy danych).
Aby użyć tej User.name
jako subdomeny, musimy się upewnić, że zawiera ona tylko znaki alfanumeryczne (z opcjonalnym podkreśleniem). Ograniczymy również nazwę do maksymalnie 32 znaków. Na koniec nie chcemy, aby użytkownicy wybierali nazwy takie jak "www", co spowoduje powstanie adresów URL, takich jak "http://www.myapp.com". Oto walidacji dla app/models/user.rb
:
validates_format_of :name, with: /^[a-z0-9_]+$/,
message: "must be lowercase alphanumerics only"
validates_length_of :name, maximum: 32,
message: "exceeds maximum of 32 characters"
validates_exclusion_of :name, in: ['www', 'mail', 'ftp'],
message: "is not available"
Opcjonalnie: zmodyfikować db/seeds.rb (tak tworzy użytkowników testowych podczas inicjalizacji bazy danych):
user = User.create! :name => 'myname', :email => '[email protected]',
:password => 'password', :password_confirmation => 'password'
Będziemy wyświetlać stronę profilu dla użytkownik gdy ktoś wpisze adres URL z subdomeny, który pasuje istniejącego użytkownika app/controllers/profiles_controller.rb
:
class ProfilesController < ApplicationController
def show
@user = User.where(:name => request.subdomain).first || not_found
end
def not_found
raise ActionController::RoutingError.new('User Not Found')
end
end
Oto przykładowy plik dla widoku app/views/profiles/show.html.erb
:
<h1>Profile</h1>
<h3><%= @user.name %></h3>
<h3><%= @user.email %></h3>
Wreszcie musimy wdrożyć routing dla subdomen.Utwórz klasę tak:
class Subdomain
def self.matches?(request)
case request.subdomain
when 'www', '', nil
false
else
true
end
end
end
Upewnij ta klasa jest ładowane automatycznie, gdy aplikacja rozpoczyna config/application.rb
:
config.autoload_paths += %W(#{config.root}/lib)
Upewnij się, że plik routes.rb
zawiera następujących trasach:
devise_for :users
resources :users, :only => :show
constraints(Subdomain) do
match '/' => 'profiles#show'
end
Jeśli użyte rails generate
dla kontrolera profili - upewnij się, że usuniesz trasę get "profiles/show"
.
See this page celu uzyskania informacji o Pomocnicy URL w aplikacji (zasadniczo trzeba użyć new_user_session_url
zamiast new_user_session_path
można określić subdomenę takiego:
root_url(:subdomain => @subdomain)
rzucić okiem na to: http://railscasts.com/episodes/221-subdomains-in-rails-3 –