2015-02-26 31 views
7

Chciałbym mieć Devise stworzyć subdomeny na mojej stronie.Czy stworzyłem poddomeny przy rejestracji

Teraz mam dwa modele:

  1. firmy: A Company mogą zarejestrować się bezpośrednio na stronie, a po zalogowaniu, możesz zaprosić swoich pracowników. Kiedy firma rejestruje się, chcę utworzyć unikatową subdomynę (np. Example.com => techcraz.example.com.)

  2. Pracownik: Employee może zarejestrować się tylko wtedy, gdy otrzyma link do zaproszenia.

Chciałbym:

  • Głównym domeny jako stronę rejestracji.
  • Jedna strona logowania dla obu Companies i .
  • Podczas logowania muszą podać nazwę domeny, a następnie powinny zostać przekierowane na stronę logowania do tej poddomeny (np. Techcraz.example.com/signin.)
  • Wprowadzając URL, który nie istnieje, powinny zostać przekierowany na stronę rejestracji.

Jestem nowy w Rails. Proszę pomóż!

Z góry dziękuję!

+0

rzucić okiem na to: http://railscasts.com/episodes/221-subdomains-in-rails-3 –

Odpowiedz

9

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

Jakieś korzyści dla Ciebie? Dlaczego alternatywa? –