Подтвердить что ты не робот

Маршрутизация ресурсов Rails 3 без идентификатора

Я создаю приложение для блога на Rails 3, и я хочу переопределить маршрут показа по умолчанию, сгенерированный для сообщения, делая

resources :posts, :except => :show

Что генерирует для маршрута шоу (если бы я его не исключил),

/post/:id

Я хочу, чтобы мой маршрут выглядел так, а вместо этого, где url_title - это строка, сгенерированная моей моделью before_save, где она удаляет не буквенно-цифровые символы и заменяет пробелы дефисом.

/:year/:month/:day/:url_title

Я пытаюсь выполнить это с помощью этого бита кода:

match "/:year/:month/:day/:url_title", :to => "posts#show", :as => :post

В теории это должно позволить мне вызвать post_path (@post) (где @post является экземпляром моего класса post), и он должен иметь возможность сортировать этот маршрут, и он почти работает.

Единственная проблема заключается в том, что он пытается заменить идентификатор сообщения в течение года. Другие поля заполняются правильно. Я думаю, что это происходит потому, что rails имеет какое-то поведение по умолчанию, которое делает его действительно, действительно хочет иметь идентификатор в URL-адресе, и он не доверяет мне использовать мой собственный уникальный идентификатор (post.url_title, в этом случае).

Я мог ошибаться. У кого-нибудь есть опыт работы с этим видом маршрутизации, или знаете, что?

4b9b3361

Ответ 1

Вы можете использовать to_param для создания рельсов.

class Post < ActiveRecord::Base
  ...
  def to_param
    "#{year}/#{month}/#{day}/#{title.parameterize}"
  end
end

Дополнительная информация: http://api.rubyonrails.org/classes/ActiveRecord/Base.html#method-i-to_param и http://www.seoonrails.com/to_param-for-better-looking-urls.html

Если вы пройдете по этому маршруту, вам нужно создать атрибут permalink и использовать Post.find_by_permalink(params[:id]), а не Post.find(params[:id])

Ответ 2

вы должны использовать такой путь

post_path(@post, :year => 2010, :month => 3, :day => 16)

или

post_path(@post, :year => @post.created_at.year, :month => @post.created_at.month, :day => @post.created_at.day)