Rails - 如何将生成的URL修复为友好的URL

时间:2011-04-27 22:54:38

标签: ruby-on-rails friendly-url

我的模型看起来像

search.rb:
  id eg: 101
  name eg: San Francisco

cars.rb
  id
  name

搜索控制器将用户重定向到汽车。

search_controller.rb
if search.search_type=='cars'
  redirect_to :controller=>'cars', :action=>'index', :id=>search
end

查询旧金山汽车列表的查询如下:

http://localhost/cars?id=101

我在search.rb中覆盖了to_param方法,如:

search.rb
def to_param
  normalized_name = name.gsub(' ', '-').gsub(/[^a-zA-Z0-9\_\-\.]/, '')
  "#{self.id}-#{normalized_name}"
end

这在某种程度上起作用: 它生成的URL看起来像:

http://localhost/cars?id=101-San-Francisco

但是,我想生成一个看起来像

的网址
http://localhost/cars/San-Francisco

我该怎么做呢? 我是否修好路线?

感谢您的帮助。

1 个答案:

答案 0 :(得分:2)

如果你没有做好准备,这可能会很棘手。控制模型如何在参数中显示的方法非常简单,正如您已经确定的那样,但这只是它的一半。稍后你将不得不检索它,所以你需要设置它:

class Search < ActiveRecord::Base
  before_save :assign_slug

  def self.from_param(id)
    self.find_by_slug(id)
  end

  def to_param
    self.slug
  end

protected
  def assign_slug
    self.slug = self.name.gsub(' ', '-').gsub(/[^\w\-\.]/, '')
  end
end

这需要在搜索模型中添加slug列,以便能够通过它查找搜索。添加索引(可能是唯一索引)可能是一个好主意,以便以后有效地检索这些索引。

在您的控制器中,您不是使用find而是使用from_param来进行检索。

您还需要添加一个采用此参数的自定义路线:

match '/cars/:search', :to => 'cars#index', :as => 'cars_search'

作为注释,您应尽可能使用路径路径生成器方法,因为多个路径可能匹配相同的参数。例如:

redirect_to cars_search_path(:search => search)