Frage

Ich mag die alle Standard-Routen, die von Rail map.resources erzeugt werden. Aber es gibt Fälle, in denen Ich mag würde eine nicht-numerische Kennung in meinen Routen verwenden. Zum Beispiel, wenn eine verschachtelte Route von Benutzern und ihren Artikeln bestehen haben, eine Standardroute als solche geschrieben werden:

map.resources :users, :has_many => [:articles] # => e.g. '/users/:id/articles/:id'

Allerdings gibt es viele Vorteile / Gründe nicht die Standard-numerische Kennung, die von Rails erzeugt zu verwenden. Gibt es eine Möglichkeit, den Standard zu ersetzen: id params auf einem anderen kanonischen Bezeichner meiner Wahl ohne resultierendes Schreiben von benutzerdefinierten Routen für jede Standard-Aktion? Sprich, wenn ich eine Route in folgendem Format will:

'/users/:login/articles/:id'

Ist diese Art von Strecken erreichbar mit map.resources

War es hilfreich?

Lösung

Wie von Rails 2.3, ist es nicht möglich, die Parameternamen zu ändern und immer noch das automatische Routing, die #resources bereitstellt.

Als Abhilfe können Sie articles mit einem :path_prefix und :name_prefix Karte:

map.resources :articles, :path_prefix => "/users/:login",
                         :name_prefix => "user_"

Die :path_prefix wirkt sich auf die URL, und die :name_prefix wirkt sich auf die generierten Namen Routen, so dass man mit diesen Strecken am Ende dann:

    user_articles GET    /users/:login/articles(.:format)          {:controller=>"articles", :action=>"index"}
                  POST   /users/:login/articles(.:format)          {:controller=>"articles", :action=>"create"}
 new_user_article GET    /users/:login/articles/new(.:format)      {:controller=>"articles", :action=>"new"}
edit_user_article GET    /users/:login/articles/:id/edit(.:format) {:controller=>"articles", :action=>"edit"}
     user_article GET    /users/:login/articles/:id(.:format)      {:controller=>"articles", :action=>"show"}
                  PUT    /users/:login/articles/:id(.:format)      {:controller=>"articles", :action=>"update"}
                  DELETE /users/:login/articles/:id(.:format)      {:controller=>"articles", :action=>"destroy"}

Als allgemeiner Regel-of-Daumen, aber ich würde Stick mit der Rails Standard Konvention von :user_id, mit der Routing Sie in Ihrer Frage gestellt. Es ist allgemein bekannt, dass :id und :user_id nicht unbedingt „numerische Kennung“ bedeuten - sie bedeuten „Resource Identifier“, was auch immer das sein mag. Und auf die Standardkonvention klebt, wird Ihr Code einfacher für jedermann zu verstehen, wer Ressourcen Routen in Rails verwendet wird.

Um eine nicht-numerische Kennung für eine Ressource zu verwenden, nur #to_param in Ihrem Modell neu zu definieren. Dann stellen Sie sicher, dass ein Finder in Ihrem Controller zu verwenden, die von dieser Kennung (anstelle der numerischen ID), wie User#find_by_login! finden werden.

Andere Tipps

Sie können den Standard ändern Sie die ID in URLs der Verwendung von to_param in Ihrem Modell zu überschreiben. z.

class User < ActiveRecord::Base
  def to_param
    login
  end
end

user_articles_path(@user) => "/users/:login/articles"

Die einzige andere Änderung müssen Sie machen, ist die Benutzer von Login zu finden, anstatt von ID in Ihrem Controller.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top