代码之家  ›  专栏  ›  技术社区  ›  Eric Lubow

带有“/”和slug的Rails RESTful路由

  •  6
  • Eric Lubow  · 技术社区  · 16 年前

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

    我已经通过以下方式完成了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 => /.+/ }

    我还有:has_many=>[:[点评]我希望这也能奏效。我尝试过的链接如下所示:

     '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

    我不确定我做错了什么。甚至有可能做到这一点吗?

    2 回复  |  直到 16 年前
        1
  •  2
  •   Jim Jeffers    16 年前

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

    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使用该路由。如果这能帮你解决问题,请告诉我!

        2
  •  1
  •   Nathan L. Walls    16 年前

    首先,我不尝试使用路由生成的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对象:

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

    我最终得到的url如下: http://wallscorp.us/content/2009/12/06/links

    干杯