【问题标题】:ID + Slug name in URL in Rails (like in StackOverflow)Rails 中 URL 中的 ID + Slug 名称(如 StackOverflow 中)
【发布时间】:2011-02-07 15:09:01
【问题描述】:

我正在尝试在 Rails 中实现这样的 URL:

http://localhost/posts/1234/post-slug-name

同时使用 ID 和 slug 名称,而不是其中任何一个

http://localhost/posts/1234

http://localhost/posts/post-slug-name

(现在我的 URL 中只有 slug 名称,所以这部分结束了)。我该怎么做?

UPD

我找到了一篇关于此的文章:http://augustl.com/blog/2009/styling_rails_urls/,而不是/id/slug,它建议使用/id-slug,这对我来说非常有效,所以我会继续这样做。

【问题讨论】:

    标签: ruby-on-rails url slug


    【解决方案1】:

    除了资源路由之外,您还需要使用Route Globbing 添加常规路由(当然假设您的posts 路由是这样定义的)。例如,

    map.resources :posts
    map.connect '/posts/:id/*slugs', :controller => 'posts', :action => 'show'
    

    【讨论】:

      【解决方案2】:

      Rails 对 SEO 友好的 URL 有一些内置支持。

      您可以通过简单地覆盖模型中的 to_param 方法以“id-title”的形式创建一个 url。

      这是来自我的一个项目,并创建了一个带有 id、类别名称和模型名称的 url:

      def to_param
        "#{id}-#{category.name.parameterize}-#{name.parameterize}"
      end 
      

      Rails 足够聪明,可以在您访问控制器操作时将其提取回普通 id 中,因此以下方法可以正常工作:

      def show
        @model = Model.find(params[:id])
        render :action => "show"
      end
      

      【讨论】:

      • 是的,这就是我在 UPD 中所拥有的。我其实也用过这种方法。
      【解决方案3】:

      使用friendly_id。它有一个不错的功能:您可以在不破坏旧网址的情况下更新您的网址。

      生成视图 url 不适合我。我只是在模型中添加了一个小方法

      def to_param
        self.friendly_id
      end
      

      【讨论】:

        【解决方案4】:

        stringex gem 包含 ActsAsUrl 以创建属性的 URI 友好表示

        https://github.com/rsl/stringex

        它还包含一个 Unidecoder 库,可以将 Unicode 转换为 ASCII。

        【讨论】:

          【解决方案5】:

          I wrote a post 关于 Rails 3 中的 slug。它提供了漂亮的 URL,甚至更多,保护您的网站免受随机脚本的影响,这些脚本仅通过增加 ID 来询问信息。它还避免了在数据库中保存 slug。

          【讨论】:

            【解决方案6】:

            我知道这个问题已经很老了,但我认为它仍然值得引起一些兴趣,而且没有一个答案是最新的,也没有提供一种方法来生成 OP 正在寻找的内容(即http://localhost/posts/1234/post-slug-name)。

            在 routes.rb 中

            get 'posts/:id/:slug', to: 'posts#show', as: 'slugged_post'
            

            然后在视图中

            <%= link_to slugged_post_path(post, post.name.parameterize) %>
            

            您可能希望在模型中定义一个 slug 方法以避免在视图中调用参数化。

            【讨论】:

            • link_to调用中应该是slugged_post_path
            猜你喜欢
            • 1970-01-01
            • 2016-08-17
            • 1970-01-01
            • 1970-01-01
            • 2015-04-16
            • 2020-04-24
            • 2017-05-22
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多