Rails 3.2 enrutamiento url amigable por fecha
Quiero implementar la aplicación blog \ noticias con la capacidad de:
mostrar todos los mensajes en la raíz:example.com/
Mostrar todos los mensajes respondiendo algún año:example.com/2012/
Mostrar todos los mensajes respondiendo algún año y mes:example.com/2012/07/
mostrar algún post por su fecha y babosa:example.com/2012/07/slug-of-the-post
Así que he creado una maqueta pararoutes.rb
expediente:
# 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\-]+/ }
Así que debería trabajar con params enindex
acción y acaba de obtener puesto por babosa enshow
acción (verificar si la fecha es correcta es una opción):
# 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
También tengo que poner en práctica.to_param
para mi modelo:
def to_param
"#{created_at.year}/#{created_at.month}/#{slug}"
end
Esto es todo lo que he aprendido de toda la noche buscando en api / guías / SO.
Pero el problema escosas extrañas siguen sucediendo para mí como nuevo en rieles:
Cuando voy alocalhost/
, la aplicación se rompe y dice que había invocadoshow
acción pero el primer objeto en la base de datos se recibió como: año (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">}
Cuando voy alocalhost/posts/2012/07/cut-test
Lo mismo sucede:
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">}
Siento que hay algo muy fácil que no he hecho, pero no puedo encontrar lo que es.
De todos modos, esta publicación será útil cuando se resuelva, porque hay soluciones solo para las babosas en url sin fecha y preguntas similares pero no útiles.