【问题标题】:Permalinks with Ruby on Rails (dynamic routes)使用 Ruby on Rails 的永久链接(动态路由)
【发布时间】:2011-01-05 19:54:31
【问题描述】:

我目前正在使用 Ruby on Rails 开发博客系统,并希望用户为静态页面或博客文章定义他的“永久链接”,意思是:

用户应该能够设置页面名称,例如。 “test-article”(应该可以通过 /posts/test-article 获得) - 我如何在 rails 应用程序和路由文件中实现这一点?

【问题讨论】:

    标签: ruby-on-rails routing routes


    【解决方案1】:

    您应该在页面或帖子的对象中具有 seolink 或 permalink 属性。然后,您只需对将返回该属性的帖子或页面模型使用 to_param 方法。

    to_param 方法用于*_path 方法,当您向它们传递对象时。

    因此,如果您的帖子标题为“foo bar”,seolink 为“baz-quux”,您可以在模型中定义 to_param 方法,如下所示:

    def to_param
      seolink
    end
    

    然后,当您执行post_path(@post) 之类的操作时,您将获得/posts/baz-quux 或您在config/routes.rb 文件中配置的任何其他相关网址(我的示例适用于资源丰富的网址)。在控制器的show 操作中,您只需使用find_by_seolink 而不是find[_by_id]

    【讨论】:

      【解决方案2】:

      我个人更喜欢这样做:

      将以下内容放入您的 Post 模型中(将其粘贴在结束“结束”标签之前的底部)

      def to_param
        permalink
      end
      
      def permalink
        "#{id}-#{title.parameterize}"
      end
      

      就是这样。您不需要更改任何 find_by 方法。这为您提供了“123-title-of-post”形式的 URL。

      【讨论】:

      • 这是不好的 SEO 做法,因为 Google 认为 URL 中的第一个词比后者更重要
      • @Houen 你建议删除 ID 吗?当然,一些额外的数字不会有太大的不同/你有任何链接可以让这更清楚吗?这对所有搜索引擎(雅虎、必应等)都一样吗?谢谢
      • 它实际上与数字无关,因为它与字数有关,并且破折号被谷歌视为单词分隔符。第一个词具有最大的 SEO 权重。抱歉,没有提及此内容,这是演讲者在 2010 年 Google IO 上告诉我们的内容
      【解决方案3】:

      修改模型中的to_param 方法确实是需要/方便的,就像其他人已经说过的那样:

      def to_param
        pagename.parameterize
      end
      

      但是为了找到帖子,您还需要更改控制器,因为默认的 Post.find 方法搜索 ID 而不是页面名称。对于显示动作,您需要这样的东西:

      def show
        @post = Post.where(:pagename => params[:id]).first
      end
      

      其他操作方法也是如此。

      您的路由规则可以与带有 ID 号的常规路由保持相同。

      【讨论】:

        【解决方案4】:

        railscasts 的#63#117 剧集可能会对您有所帮助。还可以查看那里的资源。

        【讨论】:

          【解决方案5】:

          对于用户友好的永久链接,您可以使用 gem 'has_permalink'。更多详情http://haspermalink.org

          【讨论】:

            【解决方案6】:

            您可以使用friendly_id gem。不需要特殊的控制器更改。只需将属性(例如 slug)添加到您的模型中。有关更多详细信息,请查看 gem 的 github 存储库。

            【讨论】:

              猜你喜欢
              • 2014-11-08
              • 1970-01-01
              • 2013-10-09
              • 1970-01-01
              • 2010-10-21
              • 1970-01-01
              • 2012-09-23
              • 2011-04-17
              • 1970-01-01
              相关资源
              最近更新 更多