我有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文件?
由于
答案 0 :(得分:3)
您需要考虑两个重要因素:
- 您的路线应为
resourceful
- 在您的路线中使用“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。
答案 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