рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд░реЗрд▓ 3 рдореЗрдВ рдЙрдк-рдбреЛрдореЗрди рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рд╕рднреА рд▓реЛрдЧреЛрдВ рдиреЗ рдЗрд╕
рдкреЗрдВрдЪрдХрд╕ рдХреЛ рджреЗрдЦрд╛ред
рдЬрдм рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдХрд╛ рд╕рд╛рдордирд╛ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдХрд╛рд░реНрдп рдЧрддрд┐рд╢реАрд▓ рдЙрдк-рдбреЛрдореЗрди + рдХреБрдЫ рдирд┐рд╢реНрдЪрд┐рдд рд╡рд╛рд▓реЗ рдмрдирд╛рдирд╛ рдерд╛ред рдбрд╛рдпрдиреЗрдорд┐рдХ рдХреЛ рдХрд┐рд╕реА рдПрдХ рдореЙрдбрд▓ рдХреЗ рдХреБрдЫ рдХреНрд╖реЗрддреНрд░ рдХреЗ рдЕрдиреБрд░реВрдк рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдЕрдВрддрд┐рдо рд╕рдорд╛рдзрд╛рди рдХреА рд╢рд░реНрддреЛрдВ рдХреЛ рдЖрдЧреЗ рд░рдЦрд╛ рдЧрдпрд╛ рдерд╛:
- рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдЙрдкрдбреЛрдореЗрди, рдпрд╛ рдЙрдкрдбреЛрдореЗрди рдХреЗ рдПрдХ рд╕рдореВрд╣ рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛;
- ActiveRecord рдореЙрдбрд▓ рд╕реЗ рдХрд┐рд╕реА рдлрд╝реАрд▓реНрдб рдореЗрдВ рд╕реНрдиреИрдк рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛;
- рдорд╛рд░реНрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдпрд╣ рд╕рдм рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ред
рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди
рдкрд╣рд▓реЗ рдкреИрд░рд╛рдЧреНрд░рд╛рдл рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЙрдкрд░реНрдпреБрдХреНрдд рдЙрджрд╛рд╣рд░рдг рдХреЛ рдЖрдзрд╛рд░ рдХреЗ рд░реВрдк рдореЗрдВ рд▓рд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ рдФрд░ рдЖрдкрдХреЗ рдЙрдкрдбреЛрдореЗрди рдирд╛рдо рдпрд╛ рдЗрд╕рдХреЗ рд╕рд░рдгреА рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рджреНрд╡рд╛рд░рд╛ рд╡рд┐рд╕реНрддрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред
рдЙрдкрдбреЛрдореЗрди / base.rbmodule Subdomain class Base attr_accessor :subdomain def initialize(param = ["www"] ) @subdomains = case param.class.to_s when "String", "Symbol" [param] when "Array" param else [] end end def matches?(request) self.subdomain?( request ) && ( @subdomains.map {|i| i.to_s == request.subdomain }.include? true ) end protected def subdomain?(request) request.subdomain.present? and ( request.subdomain != "www" ) end end end
рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣рд╛рдВ рд╕рдордЭрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдирд╣реАрдВ рд╣реИред
рдЗрд╕рдХреЗ рдмрд╛рдж рджреВрд╕рд░реЗ рдкреИрд░рд╛рдЧреНрд░рд╛рдл рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд▓рд┐рдП рдмрд╛рд░реА рдЖрдИред
рдЗрд╕ рд╡рд░реНрдЧ рдореЗрдВ, рд╕рдВрдпреЛрдЧ рдХреЗ рд▓рд┐рдП рдЬрд╛рдБрдЪ рдХрд░рдиреЗ рдХреА рд╡рд┐рдзрд┐ рдореЗрдВ, рд╡рд░реНрдЧ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдЗрд╕рдХреЗ рдирд╛рдо рд╕реЗ рдкреНрд░рд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИред рдЕрдЧрд▓рд╛, рд╣рдо рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рдПрдХ рдЙрдкрдбреЛрдореЗрди рдХреЗ рдЕрд╕реНрддрд┐рддреНрд╡ рдХреА рдЬрд╛рдВрдЪ рдХрд░рддреЗ рд╣реИрдВред
subdomain / active_record.rb class Subdomain::ActiveRecord < Subdomain::Base attr_reader :model attr_accessor :field def initialize(params) p = params.first @model = p[1] @field = p[0] end def matches?(request) obj = case @model.class when String @model.classify.constantize when Symbol @model.to_s.classify.constantize else @model end subdomain?(request) and ( obj.superclass == ActiveRecord::Base ) and obj.where(field.to_sym => request.subdomain).first.present? end end
рдФрд░ рддреАрд╕рд░рд╛ рдХрджрдо
рдорд╛рд░реНрдЧреЛрдВ рдореЗрдВ рд▓реЗрдЦрди рдирд┐рдпрдореЛрдВ рдХреЛ рдЖрд╕рд╛рди рдмрдирд╛рдирд╛ рдерд╛ред рдпрджрд┐ рдЖрдк рдЙрд╕ рд╡рд┐рдХрд▓реНрдк рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ рдЙрджрд╛рд╣рд░рдг рдкреНрд░рд╕реНрддреБрдд рдХрд░рддрд╛ рд╣реИ, рддреЛ рдЖрдкрдХреЛ рдХрд╛рдлреА рднрд╛рд░реА рдиреЛрдЯ рдорд┐рд▓рддреЗ рд╣реИрдВ рдФрд░ рдкрд╣рд▓реА рдирдЬрд╝рд░ рдореЗрдВ рдмрд┐рд▓реНрдХреБрд▓ рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реЛрддреЗ рд╣реИрдВред
constraints( Subdomain::ActiveRecord.new Site::User, :login ) do root :to => "main#index" end constraints( Subdomain::Base.new [:admin] ) do scope :module => "admin", :as => :admin do root :to => "main#index" end end
рдЕрдкрдиреЗ рддрд░реАрдХреЗ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдкрде рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╡рд░реНрдЧ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЕрд░реНрдерд╛рддреН
ActionDispatch :: рд░реВрдЯрд┐рдВрдЧ :: рдореИрдкрд░рдЗрд╕рдХреЗ рд▓рд┐рдП, рдПрдХ рдореЙрдбреНрдпреВрд▓ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рдерд╛ рдЬреЛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд▓реЛрдбрд┐рдВрдЧ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рджреМрд░рд╛рди рдореБрдЦреНрдп рд╡рд░реНрдЧ рдХреЗ рд╕рд╛рде рдорд┐рд▓рд╛рдпрд╛ рдЧрдпрд╛ рдерд╛ред
config / initializers / subdomain.rb ActionDispatch::Routing::Mapper.send(:include, Subdomain::Extension)
subdomain / extension.rb module Subdomain module Extension def subdomain( sub, params = {} ) if params[:scope] scope :module => params[:scope].to_s, :as => params[:scope].to_sym do unscoped_subdomain( sub ) { yield } end else m = case sub.class.to_s when "Symbol", "String" sub.to_s when "Array" sub.first when "Hash" nil end if m.blank? or params.key?(:scope) unscoped_subdomain( sub ) { yield } else scope :module => m, :as => m.to_sym do unscoped_subdomain( sub ) { yield } end end end end def unscoped_subdomain( sub ) case sub.class.to_s when "Symbol", "String", "Array" constraints( Subdomain::Base.new sub ) { yield } when "Hash" p = sub.first inst = "subdomain/
рдЬрд┐рд╕рдХреЗ рдмрд╛рдж рдкрд╣рд▓реЗ рдмрддрд╛рдП рдЧрдП рдбрд┐рдЬрд╛рдЗрдиреЛрдВ рдХреЛ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рджреНрд╡рд╛рд░рд╛ рдмрджрд▓ рджрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛:
subdomain( :active_record => { :login => Site::user } ) do root :to => "main#index" end subdomain( :admin ) do root :to => "main#index" end
рдкрд░рд┐рдгрд╛рдо
рдкрд░рд┐рдгрд╛рдо рдЙрдк рдбреЛрдореЗрди рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдмрд╣реБрдд рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╣реИред
subdomain( "subdomain" ) do root :to => "main#index"
рд░рдЪрдирд╛рддреНрдордХ рдЖрд▓реЛрдЪрдирд╛ рдФрд░ рд╕рд▓рд╛рд╣ рдХрд╛ рд╕реНрд╡рд╛рдЧрдд рд╣реИред рдореИрдВ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдШреБрдорд╛рд╡рджрд╛рд░ рдХреЛрдб рдХреЗ рд╕реНрдерд╛рдиреЛрдВ рдХреЗ рд▓рд┐рдП рдорд╛рдлреА рдЪрд╛рд╣рддрд╛ рд╣реВрдВред
рдкреБрдирд╢реНрдЪ : рдлрд╛рдЗрд▓реЗрдВ
рдкреБрд░рд╛рд▓реЗрдЦ рдореЗрдВ рдЙрдкрд▓рдмреНрдз рд╣реИрдВред
PPS : рд╕рд┐рдВрдЯреИрдХреНрд╕ рд╣рд╛рдЗрд▓рд╛рдЗрдЯрд┐рдВрдЧ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ, рд╕рдм рдХреБрдЫ рдкреВрд░реНрд╡рд╛рд╡рд▓реЛрдХрди рдореЗрдВ рд╣реИ, рдХрд┐рд╕реА рдХрд╛рд░рдг рд╕реЗ, рдЕрдВрддрд┐рдо рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВред