gemme
ruby 1.9.3
rails 3.2.11
devise 2.2.3
acts_as_tenant 0.2.9
Codice
Tutti i miei modelli sono scope da un Domain_ID:multitenancy (acts_as_tenant) con Devise (utenti predefiniti scope da sottodominio) rompe le sessioni
class User < ActiveRecord::Base
acts_as_tenant(:domain)
#...
end
Poi, in il mio application_controller, ho impostato l'attuale titolare dal dominio:
class ApplicationController < ActionController::Base
set_current_tenant_through_filter
before_filter :set_tenant
protect_from_forgery
#...
def set_tenant
#...
@domain = Domain.find_or_create_by_name(request.host)
set_current_tenant(@domain)
end
end
Tutto funziona bene per tutti i modelli ad eccezione delle sessioni: Ogni volta che una pagina viene caricata, disconnetterà il primo utente che carica una pagina con un altro titolare. Con il caricamento della pagina, sarà log-out il primo utente che [... etc.]
Ipotesi: quando Alice visita un dominio, Rails carichi current_tenant = alice_domain (ok). Tutto funziona come previsto, finché Bob non visita un altro dominio, carica current_tenant = bob_domain. Quando Alice aggiorna la sua pagina, Rails ha ancora current_tenant == bob_domain. Rails controlla la sessione: Alice non esiste con l'ambito bob_domain, quindi Devise obbliga Alice a disconnettersi. Quindi application_controller imposta current_tenant = alice_domain ... che disconnette Bob.
soluzione sporca: non utilizzare acts_as_tenant nel modello di utente, gli utenti di ambito per dominio me stesso in ogni controller, quindi sovrascrivere escogitare al login portata e di registrazione per dominio. E non sono sicuro di come rendere conto a Devise del dominio corrente nelle sessioni. A proposito, sostituire act_as_tenant con un default_scope manuale in user cade nello stesso strano bug. Sembra molto sporco andare in questo modo.
Sto cercando una soluzione pulita per giorni. Sarei molto grato per qualsiasi aiuto.
Questo non funziona per me su/utenti/modifica percorso per qualche strana ragione ... –
Sembra importante non usare 'current_user' prima di usare' set_current_tenant'. Potrebbe dipendere dal tuo server. Sto usando sottile, funziona anche con webrick. – Habax