Ruby On Rails动态路由

时间:2014-09-15 05:48:52

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

我有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文件?

由于

3 个答案:

答案 0 :(得分:3)

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

  
      
  1. 您的路线应为resourceful
  2.   
  3. 在您的路线中使用“slugs”是第三方扩展的角色
  4.   

以下是如何实现您的目标:


<强>路线

#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的惯例):

enter image description here

我喜欢张贴这张照片 - 大多数人都不知道它存在。 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

答案 1 :(得分:1)

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

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

在您的控制器中

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

希望你明白这个想法

答案 2 :(得分:0)

在您的城市模型中:

def to_param
  city_name
end

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

OR

在路线档案

资源:city,param :: cityname