Eine Subdomain pro Benutzer ist ein relativ verbreiteter Anwendungsfall bei der Entwicklung von Webanwendungen. Hier ist, wie Sie es tun können:
Erstens: sicherzustellen, dass Ihre Users table
hat eine :name column
(ich glaube Devise dies standardmäßig tut - wenn Sie nicht rails g migration AddNameToUsers name:string
ausführen können diese Spalte zu Ihrer Datenbank hinzufügen).
Um diese User.name
als Subdomain zu verwenden, müssen wir sicherstellen, dass sie nur alphanumerische Zeichen enthält (mit einem optionalen Unterstrich). Wir beschränken den Namen auf maximal 32 Zeichen. Schließlich möchten wir nicht, dass Benutzer Namen wie "www" auswählen, die URLs wie "http://www.myapp.com" ergeben. Hier ist die Validierungen für 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"
Optional: Ändern Sie Ihre db/seeds.rb (so erstellt es Testbenutzer, wenn Sie die Datenbank initialisieren):
user = User.create! :name => 'myname', :email => '[email protected]',
:password => 'password', :password_confirmation => 'password'
Wir werden eine Profilseite anzeigen für ein Benutzer, wenn jemand eine URL mit einer Sub-Domain eingibt, app/controllers/profiles_controller.rb
einen vorhandenen Benutzer übereinstimmt:
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
Hier ist ein Beispiel-Datei für die Ansicht app/views/profiles/show.html.erb
:
<h1>Profile</h1>
<h3><%= @user.name %></h3>
<h3><%= @user.email %></h3>
Zuletzt müssen wir Routing für die Subdomains implementieren.Erstellen Sie eine Klasse wie folgt aus:
class Subdomain
def self.matches?(request)
case request.subdomain
when 'www', '', nil
false
else
true
end
end
end
Stellen Sie sicher, diese Klasse automatisch geladen wird, wenn die Anwendung gestartet wird config/application.rb
:
config.autoload_paths += %W(#{config.root}/lib)
Stellen Sie sicher, Ihre routes.rb
Datei die folgenden Routen enthält:
devise_for :users
resources :users, :only => :show
constraints(Subdomain) do
match '/' => 'profiles#show'
end
Wenn Sie verwendet rails generate
für Ihren Profil-Controller - stellen Sie sicher, dass Sie die get "profiles/show"
Route entfernen.
See this page Informationen über URL-Helfer in Ihrer Anwendung mit (im Wesentlichen benötigen Sie new_user_session_url
statt new_user_session_path
zu verwenden und eine Sub-Domain wie folgt angeben:
root_url(:subdomain => @subdomain)
einen Blick auf diese: http://railscasts.com/episodes/221-subdomains-in-rails-3 –