Rails使用’/’和Slugs进行RESTful路由

我正在寻找类似wordpress slug的东西,其中我有一个像这样的URL,同时保持RESTful路由:

  http://foo.com/blog/2009/12/04/article-title 

我对保持RESTFUL路由感兴趣的原因是我无法使用很多插件,因为我使用的是自定义路由。

我已经完成了RESTful外观:

map.connect '/blog/:year/:mon/:day/:slug', :controller => 'posts', :action => 'show', :year => /\d{4}/, :month => /\d{2}/, :day => /\d{2}/, :slug => /.+/, :requirements => { :year => /\d{4}/, :month => /\d{2}/, :day => /\d{2}/, :slug => /.+/ } 

为了编写链接,我必须编写自定义link_to帮助程序来生成正确的URL。 我真的想做这个RESTful并让link_to post_path(@ post)产生上面的URL和link_to edit_post_path(@post)…文章标题/编辑

我也有:has_many => [:comments]我也会这样做。 我尝试过的link_to看起来像这样:

  'posts', :action => 'show', :year => recent_post.datetime.year.to_s, :month => sprintf('%.2d', recent_post.datetime.mon.to_i), :day => sprintf('%.2d', recent_post.datetime.mday.to_i), :slug => recent_post.slug %> 

并产生这个(这不是我想要的):

  http://foo.com/posts/show?day=30&month=11&slug=welcome-to-support-skydivers&year=2009 

我不确定我做错了什么。 是否有可能实现这一目标?

我认为它没有用,因为你没有使用自定义路线。 我一直这样做。 我只是设置一个简单的自定义路线:

 map.present_page '/blog/:year/:month/:day/:slug', :controller => 'posts', :action => 'show' 

然后你应该能够做到:

 present_page_path(:year => 2009, :month => "December", :day => "13", :slug => "just-an-example") 

您获取查询字符串的原因很可能是因为rails无论出于何种原因未与您的路由建立连接。 使用命名路由显式告诉rails使用该路由。 如果能为您解决,请告诉我!

这是我如何去做这件事……

首先,我不是要尝试使用路由生成的url方法。 另外,在检查日期参数的格式方面,我不会像你那样。 由于我是自动生成日期戳和URL创建,我不关心格式有效性,我只是格式化ActiveSupport :: TimeWithZone对象。

让我们从相关路线开始:

  map.post_by_date 'content/:year/:month/:day/:slug', :controller => 'posts', :action => 'show_by_date_slug' 

由于我不想担心参数格式化或重复,我创建了一个辅助方法并在相关控制器中包含了帮助器:

  def pubdate_slug_url(post) year = post.published_on.strftime('%Y') month = post.published_on.strftime('%m') day = post.published_on.strftime('%d') url = "/" + ["content", year, month, day, post.slug].join("/") return url end 

最后,在我看来,我只是调用方法,传入我的Post对象:

  

<%= link_to post.headline, pubdate_slug_url(post) %>

我最终得到了一个url: http : //wallscorp.us/content/2009/12/06/links

干杯。