Rails 3.2 roteamento de URL amigável por data
Quero implementar o aplicativo blog \ news com capacidade para:
mostrar todos os posts na raiz:example.com/
mostrar todos os posts respondendo algum ano:example.com/2012/
mostre todas as mensagens respondendo algum ano e mês:example.com/2012/07/
mostre algum post por sua data e slug:example.com/2012/07/slug-of-the-post
Então eu criei uma maquete pararoutes.rb
Arquivo:
# 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\-]+/ }
Então eu deveria trabalhar com params emindex
ação e é só pegar post by slug inshow
ação (verificar se a data é corect é uma opção):
# 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
Também tenho que implementarto_param
para o meu modelo:
def to_param
"#{created_at.year}/#{created_at.month}/#{slug}"
end
Isso é tudo que aprendi durante toda a noite procurando em api / guides / SO.
Mas o problema écoisas estranhas continuam acontecendo para mim como novo para trilhos:
Quando eu for paralocalhost/
, o aplicativo quebra e diz que havia invocadoshow
ação, mas primeiro objeto no banco de dados tinha sido recebido como: ano (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">}
Quando eu for paralocalhost/posts/2012/07/cut-test
mesma coisa acontece:
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">}
Eu sinto que há algo muito fácil que eu não fiz, mas não consigo encontrar o que é.
De qualquer forma, este post será útil quando for resolvido, porque existem soluções apenas para slugs no URL sem datas e questões similares, mas não úteis.