我有一个带有博客资源的blogs_controller,所以我现在有如下典型路线:
/blogs/new
/blogs/1
/blogs/1/edit #etc
但这就是我想要的:
/blogs/new
/blogs/2010/01/08/1-to_param-or-something
/blogs/2010/01/08/1-to_param-or-something/edit #etc
...
/blogs/2010/01 # all posts for January 2010, but how to specify custom action?
我知道我可以通过map.resources和map.connect的组合来实现这一点,但是我有很多通过“new_blog_path”等链接到其他页面的视图,我不想要去编辑那些。这可以单独使用map.resources了吗?这可能并不容易,但我并不反对聪明。我想的是:
map.resources :blogs, :path_prefix => ':year/:month/:day', :requirements => {:year => /\d{4}/, :month => /\d{1,2}/, :day => /\d{1,2}/}
但我不确定这对“新”或“创建”等行为有何效果,而且它还为我提供了一条路径,如/2010/01/08/blogs/1-to_param-etc
,其中包含位于网址中间的博客。
那么,有一个我缺少的聪明解决方案,还是我需要去map.connect途径?
答案 0 :(得分:13)
我最近遇到了同样的问题,虽然这可能不是你想要的,但这就是我所做的事情来处理它:
<强>配置/ 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的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)
祝你好运!
答案 1 :(得分:2)
来自API Docs:
map.connect 'articles/:year/:month/:day',
:controller => 'articles',
:action => 'find_by_date',
:year => /\d{4}/,
:month => /\d{1,2}/,
:day => /\d{1,2}/
使用上面的路线,网址“localhost:3000 / articles / 2005/11/06”映射到
params = { :year => '2005', :month => '11', :day => '06' }
看起来你想要做同样的事情,但后缀一个帖子。您的新链接和编辑链接仍然是“旧学校”链接,例如“localhost:3000 / articles / 1 / edit”和“localhost:3000 / articles / new”。只需更新“show”链接即可。