Ruby on rails 如何使用斜杠顺序(/)获得有组织的搜索URL结果?

Ruby on rails 如何使用斜杠顺序(/)获得有组织的搜索URL结果?,ruby-on-rails,Ruby On Rails,我想要一个关于books_controller中“索引”的搜索部分,其中包含来自不同作者、类别和其他属性的一些筛选选项。例如,我可以搜索“浪漫”类别,最大页数=200。问题是我得到了这个(使用pg_searchgem) 但我想要这个: 为了使我能够从同一表单中禁用“max_pages”,我将获得以下干净的url: 它会像一个我可以添加和删除的块一样工作 我应该用什么方法得到它 Obs:例如,网站在url上有这种行为 谢谢大家。您可以根据需要的格式和订单制作路线。路径参数包含在传递给控制器的

我想要一个关于books_controller中“索引”的搜索部分,其中包含来自不同作者、类别和其他属性的一些筛选选项。例如,我可以搜索“浪漫”类别,最大页数=200。问题是我得到了这个(使用
pg_search
gem)

但我想要这个:

为了使我能够从同一表单中禁用“max_pages”,我将获得以下干净的url:

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

我应该用什么方法得到它

Obs:例如,网站在url上有这种行为


谢谢大家。

您可以根据需要的格式和订单制作路线。路径参数包含在传递给控制器的
参数中,与URL参数类似

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

class BooksController < ApplicationController
  def search
    params[:category_name] # etc.
  end
end
这就得到了基本形式,现在对于另一个,你展示了它可能是另一条路径,因为参数计数改变了

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指南提供了“分段约束”和“高级约束”等更多信息:

如果您心目中的格式不适合所提供的路由,那么您也可以对整个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)。

您可以根据所需的格式和顺序创建路由。路径参数包含在传递给控制器的
参数中,与URL参数类似

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

class BooksController < ApplicationController
  def search
    params[:category_name] # etc.
  end
end
这就得到了基本形式,现在对于另一个,你展示了它可能是另一条路径,因为参数计数改变了

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指南提供了“分段约束”和“高级约束”等更多信息:

如果您心目中的格式不适合所提供的路由,那么您也可以对整个URL进行全局搜索,并按照自己的意愿对其进行解析

get "books/*search"

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

请记住,Rails匹配第一条可能的路径,因此您需要将更具体的路径(例如:max_页面和约束)放在第一位,否则它可能会失败(例如,与*其他路径匹配)。

非常感谢!我只想知道更多:我有一个来自搜索表单的参数散列,其中包含:category_name等。因此,在控制器上,我收到params[:search][:category_name]=“roman”。我需要做什么才能让应用程序明白这是相同的:路由器上指定的category\u name使url成为“books/roman”?params已经有点像散列了(尽管它们只是直接的params(
params[:category\u name]
),而不是子对象(
params[:my\u form][:category\u name]
)。如果需要,您始终可以将需要的参数转换为实际哈希。我的问题的意思是,操作“搜索”将从哈希形式接收[:搜索]使用:category_name作为他的一个键。问题是:路由器能自动识别它吗,或者我应该做些什么让它知道现在我想要:“books/param[:search][:category_name]/”?你不能像
books/param[:search][:category_name]
。路径参数总是包含为
参数[param_name]
无子对象。因此,将您的操作从say
参数require(:search.permit(:field_a,:b,:c)
更改为
参数permit(:field_a,:b,:c)
或其他,
[:search]
在行动中将不再存在。谢谢@Fire Lancer!你救了我一天!非常感谢!我只想知道更多:我有一个来自搜索表单的参数哈希,带有:category\u name等。因此,在控制器上,我收到params[:search][:category\u name]=“浪漫”。我需要做什么才能让应用程序明白这是相同的:路由器上指定的category\u name使url成为“books/roman”?params已经有点像散列了(尽管它们只是直接的params(
params[:category\u name]
),而不是子对象(
params[:my\u form][:category\u name]
)。如果需要,您始终可以将需要的参数转换为实际哈希。我的问题的意思是,操作“搜索”将从哈希形式接收[:搜索]使用:category_name作为他的一个键。问题是:路由器能自动识别它吗,或者我应该做些什么让它知道现在我想要:“books/param[:search][:category_name]/”?你不能像
books/param[:search][:category_name]
。路径参数总是包含为
参数[param_name]
无子对象。因此,将您的操作从say
参数require(:search)。permit(:field_a,:b,:c)
更改为
参数permit(:field_a,:b,:c)
否则,
[:search]
将不再存在于操作中。谢谢@Fire Lancer!您救了我的一天!