Scope dinamico delle routes - problemi con i test

Ciao a tutti,
Sto tentando di venire a capo di un grattacapo particolare. Ho
un’applicazione che ha tutti gli URL in uno scope dinamico

scope “/:agency” do
resources :users
end

Scope “accompagnato” da questa modifica delle default_url_options in un
before_filter

def default_url_options(options={})
{ :agency => params[:agency] }
end

in modo da visualizzare gli utenti solo legati a una certa agenzia.
Tutto funziona bene da web server, ma nella configurazione di test
Cucumber/RSpec/Capypara il primo parametro trovato viene messo al posto
dell’agenzia.
Per esempio user_path(User.first) diventa http://www.example.com/1/users
anzich http://www.example.com/theagency/users/1

Ho provato con un default allo scope

scope “/:agency”, defaults: { agency: ‘test-agency’} do
resources :users
end

Ma se i test passano, ora tutti gli url vengono costruiti con
test-agency come primo parametro, anzich riportare il primo parametro
dell’url.

Qualche consiglio su come risolvere o aggirare questo problema?

Grazie,

Alessandro

Il 02/03/2012 21:19, Alessandro M. ha scritto:

def default_url_options(options={})
{ :agency => params[:agency] }
end

cos a occhio, come prima cosa imposterei un valore di default nel caso
non sia
presente il params[:agency]

inoltre fai attenzione a sovrascrivere il default url proprio perch
potresti
incontrare comportamenti inaspettati. tu sei sei sicuro che TUTTE le
url,
compresa la hom page, abbiano quel parametro?

in modo da visualizzare gli utenti solo legati a una certa agenzia. Tutto
funziona bene da web server, ma nella configurazione di test
Cucumber/RSpec/Capypara il primo parametro trovato viene messo al posto
dell’agenzia.

Per esempio user_path(User.first) diventa http://www.example.com/1/users anzich
http://www.example.com/theagency/users/1

Ho provato con un default allo scope

scope “/:agency”, defaults: { agency: ‘test-agency’} do
resources :users
end

al posto dello lo scope, usa una nested route, qualcosa del genere (ma
sei
libero di modificare le varie opzioni):

resources :agencies do
resources :users
end

in questo modo le rotte manterrebero i giusti parametri nella url:

http://www.example.com/<agency_id>/users/<user_id>

e la named route diventerebbe: agency_user_path

Ma se i test passano, ora tutti gli url vengono costruiti con test-agency come
primo parametro, anzich riportare il primo parametro dell’url.

normale, non solo hai sovrascritto le opzioni dei parametri, hai anche
impostato un valore di default :wink:

puoi approfondire qui:

ciao,
A.

Il 02/03/2012 21:19, Alessandro M. ha scritto:

def default_url_options(options={})
{ :agency => params[:agency] }
end

cos a occhio, come prima cosa imposterei un valore di default nel caso non sia
presente il params[:agency]

S, non ho riportato il codice pi corrente ma invece di params[:agency]
chiamo un metodo che ritorna params[:agency] o un valore di default :slight_smile:

inoltre fai attenzione a sovrascrivere il default url proprio perch potresti
incontrare comportamenti inaspettati. tu sei sei sicuro che TUTTE le url, compresa
la hom page, abbiano quel parametro?

Lo devono avere perch una sorta di applicazione multisito. Da quel
parametro dipendono grafica e altri aspetti.

al posto dello lo scope, usa una nested route, qualcosa del genere (ma sei
libero di modificare le varie opzioni):

resources :agencies do
resources :users
end

In effetti come capita sempre la cosa pi semplice quella a cui non si
pensa mai :slight_smile: L’unico problema di questo approccio che dovrei cambiare
tutte le named routes all’interno dell’applicazione e sarebbe un po’
pesante come cosa. Vedo un po’ che succede.

Ma se i test passano, ora tutti gli url vengono costruiti con test-agency come
primo parametro, anzich riportare il primo parametro dell’url.

normale, non solo hai sovrascritto le opzioni dei parametri, hai anche
impostato un valore di default :wink:

Pensavo (speravo) che per defaults si intendesse “se questo valore non
definito dalla request”, e non “metti 'sto valore sempre e comunque” :smiley:

Per ora grazie!

Alessandro