Вопрос

Я ищу, чтобы сделать что-то подобное wordpress slug, где у меня есть URL, подобный этому, сохраняя при этом маршрутизацию RESTful:

http://foo.com/blog/2009/12/04/article-title

Причина, по которой я заинтересован в сохранении маршрутизации RESTFUL, заключается в том, что я не могу использовать многие плагины, потому что я использую пользовательские маршруты.

Я уже сделал спокойный внешний вид с:

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 => /.+/ }

Чтобы написать ссылки, мне пришлось написать пользовательские помощники link_to для генерации правильных URL-адресов.Я действительно хотел бы сделать это RESTful и, чтобы ссылка на post_path ( @post ) выдавала URL-адрес выше, а ссылка на edit_post_path(@post) ...article-title/ редактировать

У меня также есть:has_many => [:comments], и я бы хотел, чтобы это тоже работало.link_to, который я пробовал, выглядит следующим образом:

 '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 %>

и дает это (а это не то, чего я хочу):

http://foo.com/posts/show?day=30&month=11&slug=welcome-to-support-skydivers&year=2009

Я не уверен, что я делаю не так.Возможно ли вообще это сделать?

Это было полезно?

Решение

Я думаю, это не работает, потому что вы не используете пользовательский маршрут.Я делаю это постоянно.Я просто настраиваю простой пользовательский маршрут:

map.present_page '/blog/:year/:month/:day/:slug',
          :controller => 'posts', :action => 'show'

Тогда вы должны быть в состоянии сделать:

present_page_path(:year => 2009, 
                  :month => "December", 
                  :day => "13", 
                  :slug => "just-an-example")

Причина, по которой вы получаете строку запроса, скорее всего, заключается в том, что rails по какой-либо причине не устанавливает соединение с вашим маршрутом.Использование именованного маршрута явно указывает rails использовать этот маршрут.Дайте мне знать, если это решит проблему для вас!

Другие советы

Вот как я поступил по этому поводу...

Во-первых, я не пытаюсь использовать метод URL, сгенерированный маршрутом.Кроме того, я не собираюсь в той же степени, что и вы, проверять форматирование параметров даты.Поскольку я автоматически генерирую метки даты и создаю URL-адрес, меня не беспокоит достоверность формата, я просто форматирую объект ActiveSupport::TimeWithZone .

Давайте начнем с соответствующего маршрута:

  map.post_by_date 'content/:year/:month/:day/:slug', 
                  :controller => 'posts',
                  :action     => 'show_by_date_slug'

Поскольку я не хотел беспокоиться о форматировании аргументов или повторении, я создал вспомогательный метод и включил помощник в соответствующий контроллер:

  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

Наконец, на мой взгляд, я просто вызываю метод, передавая свой объект Post:

  <h2><%= link_to post.headline, pubdate_slug_url(post) %></h2>

В итоге я получаю URL, подобный: http://wallscorp.us/content/2009/12/06/links

Ваше здоровье.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top