我想按类别过滤结果,我想使用GET方法而不是POST。但是,我做错了,我无法弄清楚:表单的动作与定义的路径不匹配,因此触发了不同的方法。
以下是表格:
<div>
<%= form_tag '/expenses/search', method: 'get' do %>
<%= select_tag 'category_name', options_from_collection_for_select(Category.order(:name), :name, :name) %>
<%= submit_tag 'search' %>
<% end %>
</div>
发送此表单会产生如下URL:
http://localhost:3000/expenses/search?utf8=%E2%9C%93&category_name=Alcohol&commit=Search
然而路线的定义如下:
resources :expenses
get 'expenses/search/:category_name', to: 'gastos#search_by_category'
这意味着提交表单的URL不是我尝试提交表单的URL。正如您所想象的那样,它与show
方法对应的匹配。
如何将表单提交到匹配的网址?处理这种情况的常用方法是什么?
答案 0 :(得分:1)
您没有正确设置路线,因为它无法识别:category_name
段。您的路线应如下定义:
get 'expenses/search', to: 'gastos#search_by_category`
答案 1 :(得分:0)
如果您的路线嵌套在费用上,我建议使用阻止功能
resources :expenses do
collection do
match 'search', to: 'gastos#search_by_category`, via: :get
end
end
使用rials路由帮助是一个好习惯,尽量避免使用纯文本放置路由,在你的情况下会是:
<%= form_tag search_expenses_path, method: 'get' do %>
<%= select_tag 'category_name', options_from_collection_for_select(Category.order(:name), :name, :name) %>
<%= submit_tag 'search' %>
<% end %>
此外,不要将'query params'与'url params'混淆
HTTP // www.host.com /简档/ 12?类型= 'JSON'
在这个例子中,'12'是一个url param,在路径文件中用:( nameofparam)表示,但'type'是一个在rails路径上没有表达的查询参数。
答案 2 :(得分:0)
您可以看到,参数是由浏览器发送的(通常)不了解您的网站路由如何在其中工作。一般来说,提交表单需要一个URL(提交参数)和一组参数,如果 GET 通常 * 作为query string传递。
浏览器最终会点击表单网址中指定的确切路线,并以通常的格式提供附加到结尾的查询字符串中的所有表单参数:
...?category=stuff
您只是不能指望浏览器使用一个表单来匹配不同的路由(查询字符串不是其中一部分)只是因为它在<input>
之一中具有不同的值
* 我从来没有真正看到这种情况有所不同,但我也没有找到这方面的确切要求。
你可以尝试通过放置一个美化重定向来解决这个问题。 - 直接搜索该操作的查询,但不在那里执行搜索:而是使用收到的参数构建路径并将用户重定向到该路径。
def search_redirect
redirect_to whatever_search_path(category: params[:category])
end
这会触发路径助手来构建符合定义路线的漂亮地址。
好吧,您可以通过JavaScript提交表单,并以您想要的任何方式更改参数和URL请求。但这仍然是hacky,我也不会这样做。搜索请求中的查询字符串对我来说非常好。