使用与路线不匹配的GET方法提交表格

时间:2015-04-16 11:53:54

标签: ruby-on-rails

我想按类别过滤结果,我想使用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方法对应的匹配。

如何将表单提交到匹配的网址?处理这种情况的常用方法是什么?

3 个答案:

答案 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,我也不会这样做。搜索请求中的查询字符串对我来说非常好。