2010-09-09 7 views
20

Ho un controller CRUD per un modello.Rails 3: instradare una risorsa a un altro nome

Facendo resources :foo mi consente di instradare su /foo/:id, ecc. Per le azioni di chiamata.

Desidero aggiungere un percorso per una traduzione di "foo" in un'altra lingua. Diciamo 'toto'. Quindi voglio che tutti i percorsi /toto/:id, ecc. Funzionino esattamente come i percorsi /foo/:id, ecc.

Come posso ottenere quello?

risposta

34

è possibile aggiungere una nuova risorsa e specificare foo come il controller:

resources :toto, :controller=>"foo" 

Questo punterà tutte le azioni a "foo", ma c'è un Gotcha. Penso che ti imbatterai in problemi con i link nella pagina, se stai usando foo_url o qualcosa del genere. Quindi dovresti trovare un modo per creare gli URL in modo "dymanically" in base al controller in "request.path".

+0

ancora funziona come un fascino in Rails 4.1 – Omni

+1

Qualsiasi idea di come possiamo ottenere i punti di vista per caricare da 'viste/toto' invece di' vista/foo'? – FloatingRock

+0

'risorse: toto,: controller =>" foo ",: percorso =>" toto "' – Ruby

21

Questo vi permetterà di rinominare i percorsi visti dall'utente ma mantenere il nome originale dei controller nel codice:

scope(:path_names => { :new => "neu", :edit => "bearbeiten" }) do 
    resources :categories, :path => "kategorien" 
end 

From the Ruby on Rails Guides

+1

+1 questo è quello! –

0

È possibile ottenere qualcosa di simile a questo con portata:

scope ':language/' do 
    resources :foo, controller: 'bar_controller' 
end 

Questo rende il tuo bar_controller una risorsa per qualsiasi cosa/cosa, in cui qualcosa viene passato come il parametro: language.

così:

  • it_IT/foo
  • de_DE/foo
  • ja_JP/foo

tutti Usa gestita da bar_controller, con la mappatura delle risorse normali, e si ottiene params [ : lingua] nel controller gratuitamente.

2

Se ho capito bene, vuoi semplicemente usare un altro percorso.

resources :foo, path: 'toto' 

Ora si avrà:

GET /toto   foo#index 
GET /toto/:id  foo#show 
...