2017-09-04 23 views
0

我想从books_controller的“索引”搜索部分与来自不同作者,类别和其他属性的一些过滤器选项。例如,我可以搜索类别“浪漫”和最大的网页= 200的问题是,我得到这个(与pg_search宝石)如何使用斜杠命令(/)获得有组织的搜索URL结果?

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]

它会工作一样,我可以添加和删除块。

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

观察:this网站,例如,在url上有这种行为。

谢谢大家。

回答

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的导向有一定的弗思信息,从“段约束上”和“高级约束”: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和约束)第一否则它可能会落空(例如与匹配*等)。

+0

非常感谢!我只想更多地了解一些内容:我在搜索表单中使用了:category_name等参数。因此,在控制器上,我收到params [:search] [:category_name] =“romance”。我需要做的应用程序了解,这是相同的:category_name指定在路由器上使URL“书籍/浪漫”? –

+0

params有点像哈希已经(参见['ActionController :: Parameters'](http:// api。rubyonrails.org/classes/ActionController/Parameters.html),虽然它们只是直接参数('params [:category_name]')而不是子对象('params [:my_form] [:category_name]')。您可以随时将需要的参数转换为实际的散列 –

+0

换句话说,我的意思是动作'search'将从形式接收hash [:search],其中:category_name为他的一把钥匙。问题是:路由器能够自动识别它,或者我应该做一些事情来让它知道现在我想要的:“books/param [:search] [:category_name] /”? –

相关问题