如果没有看到路由/控制器就无法确定,但它看起来像是一些默认路由滥用。
您可能会注意到,仅输入预算下拉菜单中未提示的网址实际上并不能缩小结果范围。我认为它没有使用任何复杂的搜索逻辑,我猜它只是命名范围。
路线:
map.connect ':location/:terms', :controller => "companies", :action => "for_location"
map.connect ':terms', :controller => "companies", :action => "for_budget"
那么公司的控制器可能是这样设置的:
def for_location
@location = Location.find_by_name(params[:location])
@companies = case params[:terms]
when /3000-under|3000-to-10000|10000-to-25000|25000-to-50000|50000-above/
@location.companies.send(params[:terms])
else
@location.companies
end
end
def for_budget
@companies = case params[:terms]
when /3000-under|3000-to-10000|10000-to-25000|25000-to-50000|50000-above/
Companies.send(params[:terms])
else
@companies = Companies.all
end
end
命名范围定义为:
class Company < ActiveRecord::Base
...
named_scope :3000-under, :conditions => "budget <= 3000"
named_scope :3000-to-10000, :conditions => "budget >= 3000 AND budget <= 10000"
named_scope :3000-to-10000, :conditions => "budget >= 10000 AND budget <= 25000"
named_scope :3000-to-10000, :conditions => "budget >= 25000 AND budget <= 50000"
named_scope :3000-to-10000, :conditions => "budget >= 50000"
end
编辑:因为使这个动态是一个有趣的问题......
您只需稍加努力即可使整个搜索动态化。
路线:
map.connect ':location/:term1-:term2', :controller => "companies",
:action => "for_location", :term1 => /\d+|under|above/, :term2 => /\d+/
map.connect ':term1-:term2', :controller => "companies", :action => "for_budget",
:term1 => /\d+|under|above/, :term2 => /\d+/
控制器:
def for_location
@location = Location.find_by_name(params[:location])
@companies = @location.companies.send("search_#{params[:term1]}_#{params[:term2]}")
end
def for_budget
@companies = Companies.send("search_#{params[:term1]}_#{params[:term2]}")
end
型号:
def self.method_missing(method, *args)
if method.match(/^search_(under|above|\d+)_(\d+)$/)
first_term, second_term = $1, $2
if first_term == "under"
self.find(:conditions => ["price <= ? ", second_term])
elsif first_term == "above"
self.find(:conditions => ["price >= ? ", second_term])
else
self.find(:conditions => ["price >= ? AND price <= ?",
*[first_term,second_term].sort])
end
else
super(method, *args)
end
end
现在任何匹配 /:location/300-400 或 /:location/under-5000 或 /above-27 的连线的路线都将使用动态查找器。
超级双倍奖励:这些动态搜索可以与关联和命名范围链接起来。