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?

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top