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