Rails RESTful Routing Com '/' e Slugs
-
18-09-2019 - |
Pergunta
Eu estou olhando para fazer algo uma lesma wordpress semelhante onde tenho uma URL como esta, mantendo roteamento RESTful:
http://foo.com/blog/2009/12/04/article-title
A razão que eu estou interessado em manter roteamento RESTful é que eu sou incapaz de usar muitos plugins, porque eu estou usando rotas personalizadas.
Já fiz a aparência RESTful com:
map.connect '/blog/:year/:mon/:day/:slug',
:controller => 'posts', :action => 'show',
:year => /\d{4}/, :month => /\d{2}/,
:day => /\d{2}/, :slug => /.+/,
:requirements => { :year => /\d{4}/, :month => /\d{2}/, :day => /\d{2}/, :slug => /.+/ }
Para escrever as ligações, eu tive que escrever costume link_to ajudantes para gerar os URLs adequados. Eu realmente gostaria de fazer isso RESTful e ter a post_path link_to (@post) deu o URL acima eo edit_post_path link_to (@post) ... artigo-título / edit
Eu também tenho: has_many => [: comentários] e eu gostaria que isso funcione bem. O link_to que eu tentei parece com isso:
'posts', :action => 'show', :year => recent_post.datetime.year.to_s,
:month => sprintf('%.2d', recent_post.datetime.mon.to_i),
:day => sprintf('%.2d', recent_post.datetime.mday.to_i),
:slug => recent_post.slug %>
e rendimentos isso (o que não é o que eu quero):
http://foo.com/posts/show?day=30&month=11&slug=welcome-to-support-skydivers&year=2009
Eu não sei o que estou fazendo de errado. Será que é mesmo possível conseguir isso?
Solução
Eu acho que ele não está funcionando porque você não está usando uma rota personalizada. Eu faço isso o tempo todo. Eu simplesmente configurar uma rota personalizada simples:
map.present_page '/blog/:year/:month/:day/:slug',
:controller => 'posts', :action => 'show'
Em seguida, você deve ser capaz de fazer:
present_page_path(:year => 2009,
:month => "December",
:day => "13",
:slug => "just-an-example")
A razão que você está recebendo uma string de consulta é mais provável, porque os trilhos não está fazendo a conexão com o seu percurso por qualquer motivo. Usando uma rota nomeada diz explicitamente trilhos de usar essa rota. Deixe-me saber se isso resolve-lo para você!
Outras dicas
Aqui está como eu fui sobre isso ...
Em primeiro lugar, eu não estou tentando usar o método url gerado-route. Além disso, eu não estou indo para a mesma medida que você em termos de verificação de formatação dos parâmetros de data. Desde que eu sou auto-gerar os datestamps ea criação URL, eu não estou preocupado com a validade formato, estou simplesmente a formatação de um objeto ActiveSupport :: TimeWithZone.
Vamos começar com a rota relevante:
map.post_by_date 'content/:year/:month/:day/:slug',
:controller => 'posts',
:action => 'show_by_date_slug'
Desde que eu não queria se preocupar com argumento formatação, ou repetição, eu criei um método auxiliar e incluiu o ajudante no controlador relevante:
def pubdate_slug_url(post)
year = post.published_on.strftime('%Y')
month = post.published_on.strftime('%m')
day = post.published_on.strftime('%d')
url = "/" + ["content", year, month, day, post.slug].join("/")
return url
end
Finalmente, na minha opinião, eu simplesmente chamar o método, passando no meu post objeto:
<h2><%= link_to post.headline, pubdate_slug_url(post) %></h2>
Eu acabar com um url como: http://wallscorp.us/content / 2009/12/06 / links
Felicidades.