ich meine Website möchte URLs wie folgt aussehen haben:Recht (datiert) RESTful URLs in Rails
example.com/2010/02/my-first-post
Ich habe meine Post
Modell mit slug
Feld ('my-first-post') und published_on
Feld (von dem wir das Jahr und Monat Teile in der URL abziehen).
Ich möchte mein Post
Modell RESTful sein, so Dinge wie url_for(@post)
funktionieren wie sie sollten, dh: es sollte die zuvor erwähnte URL generieren.
Gibt es eine Möglichkeit, dies zu tun? Ich weiß, dass Sie to_param
überschreiben müssen und map.resources :posts
mit :requirements
Option gesetzt haben, aber ich kann nicht alles zum Funktionieren bringen.
Ich habe es fast fertig, ich bin 90% da. Mit resource_hacks plugin kann ich das erreichen:
map.resources :posts, :member_path => '/:year/:month/:slug',
:member_path_requirements => {:year => /[\d]{4}/, :month => /[\d]{2}/, :slug => /[a-z0-9\-]+/}
rake routes
(...)
post GET /:year/:month/:slug(.:format) {:controller=>"posts", :action=>"show"}
und in der Ansicht:
<%= link_to 'post', post_path(:slug => @post.slug, :year => '2010', :month => '02') %>
erzeugt richtigen example.com/2010/02/my-first-post
Link.
Ich würde dies gerne auch arbeiten:
<%= link_to 'post', post_path(@post) %>
Aber es braucht die to_param
Methode im Modell überschreiben. Sollte ziemlich einfach sein, außer für die Tatsache, dass to_param
String
, nicht Hash
zurückgeben muss, wie ich es möchte.
class Post < ActiveRecord::Base
def to_param
{:slug => 'my-first-post', :year => '2010', :month => '02'}
end
end
Ergebnisse in can't convert Hash into String
Fehler.
Dies scheint ignoriert werden:
def to_param
'2010/02/my-first-post'
end
wie es zum Fehler: post_url failed to generate from {:action=>"show", :year=>#<Post id: 1, title: (...)
(es ordnet falsch @post Objekt der: Jahr-Taste). Ich bin irgendwie ahnungslos, wie man es hackt.
Generische Routen (map.connect, worüber Ryan Bates spricht), named_routes und RESTful routes sind drei verschiedene Dinge. Ich kann leicht irgendeine URL haben, die ich sowohl mit generischen als auch mit benannten Routen verwenden möchte. Ich möchte hübsche URLs mit RESTful-Routen haben. –