【问题标题】:Ruby On Rails Dynamic RoutesRuby On Rails 动态路由
【发布时间】:2014-11-08 14:17:27
【问题描述】:

我有 1000 多个城市的列表,我想为每个城市生成路线,例如:

www.example.com/NewYork-Cinemas
www.example.com/Boston-Cinemas

将重定向到:

www.example.com/city_id=1234
www.example.com/city_id=1235

如何将这些类型的路由添加到 routes.rb 文件中?

谢谢

【问题讨论】:

    标签: ruby-on-rails ruby ruby-on-rails-3 ruby-on-rails-4 routes


    【解决方案1】:

    您需要考虑两个重要因素:

    1. 你的路线应该是resourceful
    2. 在您的路由中使用“slugs”是第三方扩展的作用

    以下是实现您想要的目标的方法:


    路线

    #config/routes.rb
    resources :cities, path: "", only: :show #-> domain.com/:id
    
    #app/controllers/cities_controller.rb
    class CitiesController < ApplicationController
       def show
          @city = City.find params[:id]
       end
    end
    

    上述路线可能不是你想要的,但它们会做一些非常重要的事情——它们会给你一个足智多谋的结构(保持 Rails 的约定):

    我非常喜欢张贴这张照片 - 大多数人都不知道它的存在。 You can find it here -- 它解释了你应该如何保持你的路线资源丰富。其他答案只是建议创建一个新的自定义路线 - 坏消息。您需要尽可能保持路线结构化,否则它们会变得笨拙


    查找

    其次,您需要听取其他答案的建议,并在您的应用中使用friendly_id:

    #app/models/city.rb
    class City < ActiveRecord::Base
       extend FriendlyID
       friendly_id :name, use: [:slugged, :finders]
    end
    

    这将使您能够在标题中使用“slug”名称。友好 ID 将自动处理整个过程 - 如果需要,您可以 watch a Railscast about it here。

    【讨论】:

      【解决方案2】:

      您可以使用friendly_id 为每个城市生成slug,然后您可以像这样在routes.rb 中定义

      get '/:city_slug' => 'cities#show'
      

      在你的控制器中

      def cities_controller
         def show
            @city = City.friendly.find(params[:city_slug])
         end
      end
      

      希望你能明白

      【讨论】:

        【解决方案3】:

        在您的城市模型中:

        def to_param
          city_name
        end
        

        默认情况下,ActiveRecord 对象的 to_param 方法仅使用对象的 ID。通过将此代码放入模型中,您将覆盖 ActiveRecord 默认值,因此当您链接到城市时,它将使用城市名称而不是 id 作为参数。

        或

        在路由文件中

        资源:城市,参数::城市名称

        【讨论】:

        • 这个问题是,如果城市被重命名或两个城市具有相同的名称,一切都会中断(是的,这种情况会发生)。 friendly_id gem 是解决这个问题的解决方案。
        猜你喜欢
        • 2013-10-09
        • 1970-01-01
        • 2010-10-21
        • 2011-04-17
        • 1970-01-01
        • 1970-01-01
        • 2011-01-05
        • 2018-12-28
        • 2011-05-11
        相关资源
        最近更新 更多