Я недавно столкнулся с той же проблемой, и, хотя это может быть не то, что вы ищете, это то, что я сделал, чтобы позаботиться об этом:
конфиг / routes.rb
map.entry_permalink 'blog/:year/:month/:day/:slug',
:controller => 'blog_entries',
:action => 'show',
:year => /(19|20)\d{2}/,
:month => /[01]?\d/,
:day => /[0-3]?\d/
blog_entries_controller.rb:
def show
@blog_entry = BlogEntry.find_by_permalink(params[:slug])
end
blog_entries_helper.rb:
def entry_permalink(e)
d = e.created_at
entry_permalink_path :year => d.year, :month => d.month, :day => d.day, :slug => e.permalink
end
_entry.html.erb:
<h2><%= link_to(entry.title, entry_permalink(entry)) %></h2>
и ради полноты:
blog_entry.rb:
before_save :create_permalink
#...
private
def create_permalink
self.permalink = title.to_url
end
Метод #to_url происходит от rsl's Stringex .
Я все еще новичок в Rails (и программировании), но это, наверное, самый простой способ сделать это. Это не RESTful способ решения проблем, поэтому, к сожалению, вы не получите преимущества map.resources.
Я не уверен (потому что я не пробовал), но вы можете создать соответствующих помощников в application_helper.rb
, чтобы переопределить помощников маршрута по умолчанию для blog_path и др. Если это сработает, вам не придется менять код вашего представления.
Если вы любите приключения, вы можете проверить Routing Filter . Я решил использовать его, но это похоже на излишество для этой задачи.
Также, если вы не знаете, две вещи, которые вы можете сделать, чтобы проверить ваши маршруты / пути из скрипта / консоли:
rs = ActionController::Routing::Routes
rs.recognize_path '/blog/2010/1/10/entry-title'
и
app.blog_entry_path(@entry)
Удачи!