Я хочу, чтобы мой сайт, чтобы иметь адреса вида:Довольно (датированный) RESTful URL-адрес в Rails
example.com/2010/02/my-first-post
У меня есть Post
модели с slug
поля («мой-первый пост») и published_on
поле (из которого мы будем вычитать часть года и месяца в URL-адресе).
Я хочу, чтобы моя модель Post
была RESTful, поэтому такие вещи, как url_for(@post)
, работают так, как должны, то есть: он должен генерировать вышеупомянутый URL-адрес.
Есть ли способ сделать это? Я знаю, что вам нужно переопределить to_param
и установить map.resources :posts
с набором опций :requirements
, но я не могу заставить все это работать.
У меня почти все, я на 90%. Используя resource_hacks plugin я могу достичь этого:
map.resources :posts, :member_path => '/:year/:month/:slug',
:member_path_requirements => {:year => /[\d]{4}/, :month => /[\d]{2}/, :slug => /[a-z0-9\-]+/}
rake routes
(...)
post GET /:year/:month/:slug(.:format) {:controller=>"posts", :action=>"show"}
и в представлении:
<%= link_to 'post', post_path(:slug => @post.slug, :year => '2010', :month => '02') %>
формирует правильную example.com/2010/02/my-first-post
ссылку.
Я хотел бы, чтобы это работало слишком:
<%= link_to 'post', post_path(@post) %>
Но нужно переопределить метод to_param
в модели. Должно быть довольно легко, за исключением факта, что to_param
должен вернуть String
, а не Hash
, так как мне бы это понравилось.
class Post < ActiveRecord::Base
def to_param
{:slug => 'my-first-post', :year => '2010', :month => '02'}
end
end
Результаты can't convert Hash into String
ошибка.
Это, кажется, игнорируется:
def to_param
'2010/02/my-first-post'
end
как это приводит к ошибке: post_url failed to generate from {:action=>"show", :year=>#<Post id: 1, title: (...)
(он ошибочно приписывает @post объект к: год ключа). Я не знаю, как это взломать.
Общие маршруты (map.connect, о которых говорит Райан Бэйтс), маршруты named_routes и RESTful - это три разные вещи. Я могу легко получить любой URL-адрес, который я хочу использовать как с помощью родовых, так и с именованных маршрутов. Я хочу иметь довольно URL-адреса, используя маршруты RESTful. –