【问题标题】:Rails 4. Different routing for few models (relatd and not)Rails 4. 少数模型的不同路由(相关和非相关)
【发布时间】:2014-08-05 10:00:23
【问题描述】:

我现在正在做网站 SEO 优化,我需要做的是正确的路由,以使链接对 seo 非常友好。我已经阅读了很多关于路由的信息,但它在我的脑海中一团糟,我卡住了。

所以我有属于 StoreType 模型的 Store 模型,属于 City 模型和 District 模型 + District belongs_to :city。

我需要这样的路线:

/stores/store_type_name/                - store_type 'show' action(list of stores by type)
/stores/city_name/store_type_name/          - store_type 'show' action(list of stores by city&type)
/stores/city_name/district_name/store_type_name/    - store_type 'show' action(list of stores by city&district&type)
/stores/city_name/store_type_name/store_name        - store 'show' action 

我现在想出的唯一解决方案是: 路线.rb

namespace :stores do 
  get ':transliterated', to: 'store_types#show'
  get ':transliterated/:name_en', to: 'store_types#city'
  get ':transliterated/:name_en/:id', to: 'store_types#district'
end   

使用这样的控制器:

def district
  @store_type = StorerType.find_by_transliterated(params[:transliterated])
  @city = City.find_by_name_en(params[:name_en])
  @district = District.find_by_id(params[:id])

  if @store_type && @city && @district
    stores = @store_type.stores.where(city_id:@city.id)
    @stores = stores.where(district_id:@district.id)
  else
    redirect_to root_path
  end
end     

效果很好,但是 1) 我现在无法为最后一个示例添加路由(存储显示页面),因为路由正在该命名空间中寻找 :transliterated 参数,如果找不到记录则重定向。 2)我知道这个解决方案很糟糕,可以做得更好,我只是不知道怎么做。请给我一个建议。

PS。实际上网站上已经实现了路由,所以我只为上面列出的这 4 个 url 寻找解决方案,没有触及其他任何东西。

【问题讨论】:

    标签: ruby-on-rails url routing seo


    【解决方案1】:

    足智多谋

    首先,让我为你定义所有路由的基础......

    Rails 的路由结构被称为 resourceful - 意思是基于围绕 资源/对象。与 Ruby 是 object-orientated language 一样,Rails 是一个面向对象的框架。路线也不例外:

    这意味着您对路线所做的任何事情必须基于资源,如下所示:

    #config/routes.rb
    namespace :stores do
       resources :store_types, only: [:show], path: "" do #-> domain.com/stores/:id -> store_types#show
          get :name_en, action: :city #-> domain.com/stores/:store_type_id/:name_en
          get :name_en/:id, action: :district #-> domain.com/stores/:store_type_id/:name_en/:id
       end
    end
    

    这将使您能够将流量直接发送到您的 store_types 控制器,而无需到处乱跑

    --

    friendly_id

    另外需要考虑的是一个名为friendly_id的宝石

    friendly_id 基本上允许您使用slugs 定义/调用路由,而不是ids。不同之处在于路线保持不变 - 它是 数据,并且该数据的处理会发生变化

    通常在 Rails 中,您会像这样创建路由:domain.com/controller/:id

    例如,当您将人们发送到链接时,他们会点击domain.com/controller/1。 Friendly_ID 基本上可以将人发送到domain.com/controller/your_name,处理方式与使用 ID 完全相同:

    #app/models/your_model.rb
    Class YourModel < ActiveRecord::Base
       friendly_id :name, use: [:slugged, :finders]
    end
    

    这将允许您调用:

    #app/controllers/your_controller.rb
    Class YourController < ApplicationController
       def show
          @model = Model.find params[:id]
       end
    end
    

    【讨论】:

    • 感谢这个例子,它帮助我更好地理解了路线。但我仍然有为/stores/city_name/store_type_name/store_name 创建路线的问题 - 我的商店“展示”操作。当我尝试将它嵌套在我的“商店”命名空间中时,我的控制器会检查它的 StoreType 参数和重定向。我怎样才能得到/stores/city_name/store_type_name/store_name 的确切路径? ps:是的,我知道friendly_id gem,这是让生活更轻松的好工具,但在这种情况下无法帮助我。
    【解决方案2】:

    您可以在 url 中使用一些静态字符串来帮助识别操作,例如:

    namespace :stores do 
      get 'type/:transliterated', to: 'store_types#show'
      get 'type/:transliterated/city/:name_en', to: 'store_types#city'
      get ':transliterated/:name_en/:id', to: 'store_types#district'
    end 
    

    【讨论】:

      猜你喜欢
      • 2014-12-13
      • 1970-01-01
      • 2023-03-05
      • 2013-09-17
      • 1970-01-01
      • 1970-01-01
      • 2017-01-06
      • 2015-06-08
      • 1970-01-01
      相关资源
      最近更新 更多