如何使用斜杠订单(/)获得有组织的搜索URL结果?

时间:2017-09-04 17:23:23

标签: ruby-on-rails

我想在books_controller的“index”上找到一个搜索部分,其中包含来自不同作者,类别和其他属性的一些过滤器选项。例如,我可以搜索“浪漫”类别和最大页数= 200.问题是我得到了这个(使用pg_search宝石)

  

http://localhost:3000/books?utf8=%E2%9C%93&query%5Btitle%5D=et&button=

但我想要这个:

  

http://localhost:3000/books/[category_name]/[author]/[max_pages]/[other_options]

如果我想从同一个表单中禁用“max_pages”,我会得到这个干净的网址:

http://localhost:3000/books/[category_name]/[author]/[other_options]

它可以像我可以添加和删除的块一样工作。

我应该使用什么方法来获取它?

例如,

Obs:this网站在网址上有这种行为。

谢谢大家。

1 个答案:

答案 0 :(得分:2)

您可以为所需的格式和订单制作路线。路径参数包含在传递给控制器​​的params中,如URL参数。

get "books/:category_name/:author/:max_pages/:other_options", to: "books#search"

class BooksController < ApplicationController
  def search
    params[:category_name] # etc.
  end
end

如果其他选项包括斜杠,则可以使用globbing。

get "books/:category_name/:author/:max_pages/*other"
"/books/history/farias/100/example/other"
params[:other]# "example/other"

这样就可以获得基本形式,现在对于另一个,你会发现它可能只是另一条路径,因为参数数量已经改变了。

get "books/:category_name/:author/*other_options", to: "books#search"
params[:max_pages] # nil

如果您有多个具有相同参数数量的路径,则可以添加约束来分隔它们。

get "books/:category_name/:author/:max_pages/*other", constraints: {max_pages: /\d+/}
get "books/:category_name/:author/*other"

Rails指南提供了一些信息,来自&#34; Segment Contraints&#34;和&#34;高级约束&#34;:http://guides.rubyonrails.org/routing.html#segment-constraints

如果您考虑的格式不合理地适合所提供的路由,您也可以将整个URL全局化并根据需要对其进行解析。

get "books/*search"

search_components = params[:search].split "/"
#...decide what you want each component to mean to build a query

请记住,Rails与第一个可能的路线匹配,因此您需要先将更具体的路线(例如:max_pages和约束)放入其中,否则它可能会掉落(例如匹配* other)。