我的模型看起来像
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
我该怎么做呢? 我是否修好路线?
感谢您的帮助。
答案 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)