Rails 3.2-freundliches URL-Routing nach Datum
Ich möchte eine Blog \ News-Anwendung mit folgenden Funktionen implementieren:
zeige alle Beiträge bei root:example.com/
Zeige alle Beiträge, die auf ein Jahr antworten:example.com/2012/
Zeige alle Beiträge, die auf ein Jahr und einen Monat antworten:example.com/2012/07/
zeige einen Beitrag nach Datum und Schnecke:example.com/2012/07/slug-of-the-post
Also habe ich ein Modell für erstelltroutes.rb
Datei:
# GET /?page=1
root :to => "posts#index"
match "/posts" => redirect("/")
match "/posts/" => redirect("/")
# Get /posts/2012/?page=1
match "/posts/:year", :to => "posts#index",
:constraints => { :year => /\d{4}/ }
# Get /posts/2012/07/?page=1
match "/posts/:year/:month", :to => "posts#index",
:constraints => { :year => /\d{4}/, :month => /\d{1,2}/ }
# Get /posts/2012/07/slug-of-the-post
match "/posts/:year/:month/:slug", :to => "posts#show", :as => :post,
:constraints => { :year => /\d{4}/, :month => /\d{1,2}/, :slug => /[a-z0-9\-]+/ }
Also sollte ich mit params in arbeitenindex
Action und einfach per Slug-In postenshow
Aktion (Prüfen, ob das Datum korrekt ist, ist eine Option):
# GET /posts?page=1
def index
#render :text => "posts#index<br/><br/>#{params.to_s}"
@posts = Post.order('created_at DESC').page(params[:page])
# sould be more complicated in future
end
# GET /posts/2012/07/19/slug
def show
#render :text => "posts#show<br/><br/>#{params.to_s}"
@post = Post.find_by_slug(params[:slug])
end
Auch muss ich umsetzento_param
für mein modell:
def to_param
"#{created_at.year}/#{created_at.month}/#{slug}"
end
Das ist alles, was ich aus der nächtlichen Suche in api / guides / SO gelernt habe.
Aber das Problem istseltsame Dinge passieren immer wieder für mich wie neu auf Schienen:
Wenn ich gehelocalhost/
Die App bricht ab und sagt, dass sie aufgerufen hatteshow
Aktion, aber das erste Objekt in der Datenbank wurde empfangen als: Jahr (sic!):
No route matches {:controller=>"posts", :action=>"show", :year=>#<Post id: 12, slug: "*", title: "*", content: "*", created_at: "2012-07-19 15:25:38", updated_at: "2012-07-19 15:25:38">}
Wenn ich gehelocalhost/posts/2012/07/cut-test
das gleiche passiert:
No route matches {:controller=>"posts", :action=>"show", :year=>#<Post id: 12, slug: "*", title: "*", content: "*", created_at: "2012-07-19 15:25:38", updated_at: "2012-07-19 15:25:38">}
Ich habe das Gefühl, dass es etwas sehr Leichtes gibt, das ich nicht gemacht habe, aber ich kann nicht finden, was es ist.
Auf jeden Fall wird dieser Beitrag hilfreich sein, wenn er gelöst ist, da es nur Lösungen für URLs ohne Datum und ähnliche, aber nicht nützliche Fragen gibt.