您可以制作您想要的格式和顺序的路线。路径参数包含在传递给控制器的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和约束)第一否则它可能会落空(例如与匹配*等)。
非常感谢!我只想更多地了解一些内容:我在搜索表单中使用了:category_name等参数。因此,在控制器上,我收到params [:search] [:category_name] =“romance”。我需要做的应用程序了解,这是相同的:category_name指定在路由器上使URL“书籍/浪漫”? –
params有点像哈希已经(参见['ActionController :: Parameters'](http:// api。rubyonrails.org/classes/ActionController/Parameters.html),虽然它们只是直接参数('params [:category_name]')而不是子对象('params [:my_form] [:category_name]')。您可以随时将需要的参数转换为实际的散列 –
换句话说,我的意思是动作'search'将从形式接收hash [:search],其中:category_name为他的一把钥匙。问题是:路由器能够自动识别它,或者我应该做一些事情来让它知道现在我想要的:“books/param [:search] [:category_name] /”? –