Маршрутизация ресурсов 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, в этом случае).
Я мог ошибаться. У кого-нибудь есть опыт работы с этим видом маршрутизации, или знаете, что?
Ответы
Ответ 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)