如何实现名称路由而不是id

问题描述 投票:-1回答:3

我需要网址,

本地主机:3000 /纽约

代替,

本地主机:19分之3000

ruby-on-rails
3个回答
1
投票

在你的gem文件中写

 gem "friendly_id"

在gemfile中编写gem后运行bundle install

创建迁移以在模型中添加slugs列

 rails g migration AddSlugToCity

 add_column :cities, :slug, :string
 add_index :cities, :slug, unique: true

在你的控制器写

  @city = City.friendly.find(params[:id])

在您的城市模块中使用友好ID

class City < ActiveRecord::Base
  extend FriendlyId
  friendly_id :title, use: :slugged
end

0
投票

那么,你需要在路线中指定param

resources :cities, param: :name

此外,Rails使用模型上定义的to_param方法,该方法应该返回您要查找的参数 - 您还需要在City上定义它:

class City < ActiveRecord::Base
  # ...
  def to_param; name; end
  # ...
end

然后,当您生成路线时,您可以将对象直接传递给city_path

link_to @city.name, city_path(@city)

最后,但并非最不重要的是,调整你的控制器find_by name,而不是id:

@city = City.find_by! name: params[:name]

或者,对于开箱即用的解决方案,尝试一些现有的宝石,如friendly_id


0
投票

你可以做get '/:city_name' => 'city#city_method', as: 'city'

<%= link_to @city.name, city_path(city_name: @city.name) %>一样使用它

© www.soinside.com 2019 - 2024. All rights reserved.