2015-02-26 12 views
7

Ich möchte Devise Subdomains auf meiner Website erstellen lassen.Have Devise erstellen eine Subdomain bei der Registrierung

Gerade jetzt, ich habe zwei Modelle:

  1. Firma: A Company können direkt auf der Website registrieren, und nach der Anmeldung können ihre Mitarbeiter einladen. Wenn das Unternehmen registriert, möchte ich eine einzigartige Sub-Domain (zum Beispiel example.com => techcraz.example.com.) Erstellt werden

  2. Mitarbeiter: Ein Employee kann nur registriert werden, wenn sie eine Einladung Verbindung empfangen.

Was ich möchte:

  • Die Hauptdomain als Registrierungsseite.
  • Eine einzelne Anmeldeseite für Companies und Employees.
  • Bei der Unterzeichnung in sie einen Domain-Namen, dann sollten sie auf das Vorzeichen umgeleitet werden in Seite für die Sub-Domain (zB techcraz.example.com/signin.)
  • Wenn Sie eine URL eingeben, die existieren bieten müssen nicht, sie sollten auf die Registrierungsseite weitergeleitet werden.

Ich bin neu bei Rails. Bitte helfen Sie!

Vielen Dank im Voraus!

+0

einen Blick auf diese: http://railscasts.com/episodes/221-subdomains-in-rails-3 –

Antwort

9

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) 
+0

Vorteile für Sie Warum die Alternative? –

Verwandte Themen