Я бы хотел, чтобы на моем сайте были URL-адреса, выглядящие так:
example.com/2010/02/my-first-post
У меня есть Post
модель с полями slug
('my-first-post') и полем published_on
(из которых мы будем вычитать части года и месяца в URL).
Я хочу, чтобы моя Post
модель была RESTful, чтобы такие вещи, как url_for(@post)
, работали так, как они должны, т.е. она должна генерировать вышеупомянутый URL.
Есть ли способ сделать это? Я знаю, что вам нужно переопределить to_param
и иметь map.resources :posts
с установленной опцией :requirements
, но я не могу заставить все это работать.
Я почти сделал это, я на 90%. С помощью плагина resource_hacks я могу добиться этого:
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 ключу: year). Я не знаю, как взломать его.