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

Eri*_*bow 6 rest ruby-on-rails link-to

我正在寻找类似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 => /.+/ }
Run Code Online (Sandbox Code Playgroud)

为了编写链接,我必须编写自定义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 %>
Run Code Online (Sandbox Code Playgroud)

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

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

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

Jim*_*ers 2

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

map.present_page '/blog/:year/:month/:day/:slug',
          :controller => 'posts', :action => 'show'
Run Code Online (Sandbox Code Playgroud)

那么你应该能够做到:

present_page_path(:year => 2009, 
                  :month => "December", 
                  :day => "13", 
                  :slug => "just-an-example")
Run Code Online (Sandbox Code Playgroud)

您获得查询字符串的原因很可能是因为 Rails 出于某种原因没有连接到您的路线。使用命名路线明确告诉 Rails 使用该路线。让我知道这是否能为您解决问题!

  • 不幸的是,诸如“present_page_url(@post)”或“url_for(@post)”之类的东西无法使用此解决方案。 (2认同)