【问题标题】:Rails routing - custom routes for ResourcesRails 路由 - 资源的自定义路由
【发布时间】:2011-01-17 03:34:53
【问题描述】:

我目前正在构建一个 Rails 应用程序,我想坚持所有那些花哨的东西,比如 REST 和资源,但我想稍微自定义一下我的路线。我希望我的 GET 路由更冗长一些 - 我正在创建的应用程序是一个简单的博客,所以我更喜欢 GET /posts/1-my-first-post 之类的东西,而不是 GET /posts/1

任何想法如何做到这一点?在网上没有找到任何东西。

【问题讨论】:

    标签: ruby-on-rails ruby resources routes


    【解决方案1】:

    路线:

    map.resources :posts
    

    型号:

    class Post < ActiveRecord::Base
      def to_param
        "#{id.to_s}-#{slug}"
      end
    end
    

    应该做的伎俩。

    顺便说一句:http://railscasts.com/episodes/63-model-name-in-url

    【讨论】:

      【解决方案2】:

      在你的模型中定义一个to_param 方法,所有的 url 助手都会使用你使用该方法返回的内容,例如:

      class Post < ActiveRecord::Base
        der to_param
          slug
        end
      end
      

      您还需要为此调整控制器。替换:

      Post.find(params[:id])
      

      与:

      Post.find_by_slug(params[:id])
      

      另请注意,当使用 find_by_* 方法找不到记录时 find 方法会引发 ActiveRecord::RecordNotFound 异常,不会引发异常,因此您需要手动检查。

      【讨论】:

        【解决方案3】:

        您会发现friendly_id 插件很有用,因为它还可以在您重命名 slug 时处理重定向(因此对 seo 友好)、处理名称冲突并与 find 方法无缝集成,因此您无需触摸控制器方法(除了重定向的东西)。

        【讨论】:

          【解决方案4】:

          或者...

          将这样的方法添加到post.rb

          def path
            "/posts/#{id}-#{slug}"
          end
          

          然后在您的视图中使用以下内容:

          【讨论】:

            【解决方案5】:

            或者...

            将这样的方法添加到application_helper.rb

            def permalink(post)
              "#{post_path(post)}-#{post.slug}"
            end
            

            然后在您的视图中使用以下内容(使用permalink(@post) 而不是post_path

            <%= link_to @post.title, permalink(@post) %>
            

            【讨论】:

              猜你喜欢
              • 2014-08-22
              • 2011-07-05
              • 2015-09-26
              • 2016-09-28
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多