8 Stimmen

Rails-Routen mit Geltungsbereich ":locale" und flachen verschachtelten Ressourcen

Ich möchte also, dass Rails ortsspezifische Routen für mich handhabt, z.B.

/en/companies
/nl/companies

Das funktioniert hervorragend mit der Definition von Routen:

scope "(:locale)", :locale => /en|nl/ do
  resources :companies
end

Gleichzeitig haben die Unternehmen aber auch flache, verschachtelte Ressourcen, etwa so:

scope "(:locale)", :locale => /en|nl/ do
  resources :companies, :shallow => true do
    resources :pages
  end
end

Dies ermöglicht Pfade wie /en/companies/1/pages , aber nicht Pfade wie /en/pages/1/edit . Da "shallow" auch den "locale"-Teil des Pfades entfernt, muss ich wohl mit /pages/1/edit?locale=en . Gibt es keine Möglichkeit, Rails zu bekommen, um flache verschachtelte Ressourcen mit Gebietsschemata in einer Weise zu behandeln, dass ich verwenden kann /en/pages/1/edit ?

14voto

Pascal Lindelauf Punkte 4642

Ah, ja! Ich habe die Antwort gefunden in die API-Dokumentation . Die Magie liegt in der :shallow_path Schlüsselwort und im obigen Beispiel funktioniert es folgendermaßen:

scope :path => "(:locale)", :shallow_path => "(:locale)", :locale => /en|nl/ do
  resources :companies, :shallow => true do
    resources :pages
  end
end

Jetzt ist eine URL wie /en/pages/1/edit funktioniert perfekt!

3voto

Olivier Lacan Punkte 2546

Vielen Dank, Pascal, das war wirklich nützlich für mich. Ich habe ein ähnliches Verhalten beim Einrichten meiner verschachtelten Ressourcen festgestellt.

Ich würde etwas hinzufügen, nämlich die Möglichkeit, eine Blockanweisung für shallow anstelle eines Parameters zu verwenden. Im Moment werden mit der von Ihnen angegebenen Syntax nur die direkten Nachkommen (:pages) als oberflächlich eingestuft.

Wenn Sie zufällig eine Ebene tiefer schachteln wollen (lassen wir die Diskussion darüber, ob dies die beste Vorgehensweise ist oder nicht, beiseite), können Sie einen flachen Block verwenden, der so tief wie nötig ist:

resources :users do 
  shallow do
    resources :categories do
      resources :sections do
        resources :pages
      end
    end
    resources :news
  end
end

Hier ein Beispiel für die verfügbaren Routen-Helfer, die Sie für alle in :users verschachtelten Ressourcen haben werden

new_category_section  GET    (/:locale)(/:locale)/categorys/:category_id/sections/new(.:format)     {:locale=>/fr|en/, :action=>"new", :controller=>"sections"}
edit_section          GET    (/:locale)(/:locale)/sections/:id/edit(.:format)                       {:locale=>/fr|en/, :action=>"edit", :controller=>"sections"}
section               GET    (/:locale)(/:locale)/sections/:id(.:format)                            {:locale=>/fr|en/, :action=>"show", :controller=>"sections"}
                      PUT    (/:locale)(/:locale)/sections/:id(.:format)                            {:locale=>/fr|en/, :action=>"update", :controller=>"sections"}
                      DELETE (/:locale)(/:locale)/sections/:id(.:format)                            {:locale=>/fr|en/, :action=>"destroy", :controller=>"sections"}

   section_pages      GET    (/:locale)(/:locale)/sections/:section_id/pages(.:format)              {:locale=>/fr|en/, :action=>"index", :controller=>"pages"}
                      POST   (/:locale)(/:locale)/sections/:section_id/pages(.:format)              {:locale=>/fr|en/, :action=>"create", :controller=>"pages"}
new_section_info_page GET    (/:locale)(/:locale)/sections/:section_id/pages/new(.:format)          {:locale=>/fr|en/, :action=>"new", :controller=>"pages"}
        dit_info_page GET    (/:locale)(/:locale)/pages/:id/edit(.:format)                          {:locale=>/fr|en/, :action=>"edit", :controller=>"pages"}
            info_page GET    (/:locale)(/:locale)/pages/:id(.:format)                               {:locale=>/fr|en/, :action=>"show", :controller=>"pages"}
                      PUT    (/:locale)(/:locale)/pages/:id(.:format)                               {:locale=>/fr|en/, :action=>"update", :controller=>"pages"}
                      DELETE (/:locale)(/:locale)/pages/:id(.:format)                               {:locale=>/fr|en/, :action=>"destroy", :controller=>"pages"}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X