我想在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网站在网址上有这种行为。
谢谢大家。
答案 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)。