2013-10-11 12 views
5

Per Reasons ™, voglio che un controller gestisca le richieste html e un altro gestisca le richieste di API json.Rails routing: vincoli di formato quando nessuno è specificato

Ho questo nei miei percorsi:

scope module: :api, as: :api do 
    constraints format: :json do 
    resources :users 
    end 
end 
constraints format: :html do 
    resources :users 
end 

Questa grande opera quando l'URL sfoggia un suffisso: /users.json mi passa per la Api::UsersController à la api_users_path; /users.html passa attraverso il mio UsersController à la users_path.

Tuttavia, ciò non si comporta come previsto quando l'URL non contiene suffisso. L'implementazione dei vincoli come lambda mostra che le cose vanno storte:

e tuttavia finisce nel controller api.

Nessun giochetto con classi di vincoli personalizzati o lambda o qualsiasi cosa impedisce ai binari di selezionare il primo percorso definito se nessuno dei vincoli corrisponde.

non riesco a trovare un modo per scrivere un vincolo che cattura quando l'URL manca un suffisso, e non mi sento come se dovessi avere to request.format == :html rapporti vero quando sto navigando /users. Perché il secondo vincolo non è quello?

Inoltre, mentre potrei "sistemarlo" cambiando l'ordine di questi due, preferirei piuttosto sapere perché i miei vincoli non funzionano correttamente.

Qualcuno sa come applicare questi vincoli in modo diverso per attivare in modo efficace qualunque sia il formato, non solo il suffisso URL, o avere un vincolo esplicito che non contiene suffisso di formato?

+0

la sopraelevazione cattura secondo contraint che il percorso doesnt partita – apneadiving

+0

Perché non si trova semplicemente il formato della richiesta se stessi per tutte le azioni in vostro api ? – apneadiving

+0

in realtà, dal momento che lo spazio dei nomi del controller non capisco perché hai bisogno di vincoli di instradamento – apneadiving

risposta

3

Non penso che sia necessario il secondo blocco di vincoli (quello per :html). Penso che questo dovrebbe fare quello che vuoi:

scope module: :api, as: :api do 
    constraints format: :json do 
    resources :users 
    end 
end 

resources :users 
+0

Sorprendentemente, no! Ciò rimanda comunque '/ users' come' text/html' al controller api, attivando un 406. –

+0

La creazione di un'app pulita indica che questo funziona, quindi c'è qualcosa nello stack della mia app che è profondamente in disordine. Quando lo scoprirò, lo posterò qui, ma visto che questa abbondanza sta per scadere ... –

+0

Augh, è mancato per un minuto. :/ –

1

Estendere la risposta di Jeremy .. Che cosa succede se si inseriscono i percorsi degli utenti di default HTML prima tha portata API per gli itinerari?

come,

resources :users 
scope module: :api, as: :api do 
    constraints format: :json do 
    resources :users 
    end 
end 

Stranamente, questo funziona per me!

+0

Cambiando l'ordine, con o senza vincoli, * fa * funziona, che è quello che sto facendo ora. Ho detto: "Anche se potrei" aggiustare "questo cambiando l'ordine di questi due, preferirei piuttosto sapere perché i miei vincoli non funzionano correttamente." "Perché mentre sovrapponevo le rotte non era la mia chiamata, io" Piuttosto, avere le rotte API per un'applicazione API-centrica vengono prima di tutto. –

+0

Aww .. Il mio male! Passato rapidamente alla domanda. Ma considerando Ruby come linguaggio guidato da una procedura, questa dovrebbe essere la soluzione migliore. – Aditya

1

L'impostazione del formato predefinito senza suffisso da json dovrebbe occuparsi delle vostre esigenze.

scope module: :api, as: :api, defaults: { format: :json} do 
    constraints format: :json do 
    resources :users 
    end 
end 

Solo esplicite richieste suffisso .html finiscono in questa risorsa

resources :users 
Problemi correlati