Przyjazny routing URL Rails 3.2 według daty

Chcę zaimplementować aplikację blogową z możliwością:

pokaż wszystkie posty w katalogu głównym:example.com/pokaż wszystkie posty odpowiadające w pewnym roku:example.com/2012/pokaż wszystkie posty odpowiadające na niektóre lata i miesiące:example.com/2012/07/pokaż jakiś post według daty i slug:example.com/2012/07/slug-of-the-post

Dlatego stworzyłem makietęroutes.rb plik:

# 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\-]+/ }

Powinienem więc pracować z parametramiindex akcja i po prostu post przez slug inshow akcja (sprawdzanie, czy data jest poprawna):

# 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

Muszę też zaimplementowaćto_param dla mojego modelu:

def to_param
  "#{created_at.year}/#{created_at.month}/#{slug}"
end

To wszystko, czego nauczyłem się podczas całonocnego wyszukiwania w api / guides / SO.

Ale problem jestdziwne rzeczy się dzieją dla mnie jako nowości na szynach:

Kiedy idę dolocalhost/, aplikacja się zrywa i mówi, że wywołałashow akcja, ale pierwszy obiekt w bazie danych otrzymał: rok (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">}

Kiedy idę dolocalhost/posts/2012/07/cut-test to samo dzieje się:

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">}

Czuję, że jest coś bardzo łatwego, czego nie zrobiłem, ale nie mogę znaleźć tego, co to jest.

W każdym razie ten post będzie pomocny, gdy zostanie rozwiązany, ponieważ istnieją rozwiązania tylko dla ślimaków w url bez daty i podobne, ale nie przydatne pytania.

questionAnswers(2)

yourAnswerToTheQuestion