您的form_tag() 语法不正确。 form_tag 接受两个哈希作为参数:一个用于 url,一个用于 html 属性。
form_tag(url_for_options = {}, options = {}, &block)
启动一个表单标签,将动作指向一个配置了 url_for_options 的 url,就像 ActionController::Base#url_for 一样。方法
表单默认为 POST。
选项
:multipart - 如果设置为 true,则 enctype 设置为
“多部分/表单数据”。
:method - 提交表单时使用的方法,通常是
“获取”或“发布”。如果使用“patch”、“put”、“delete”或其他动词,
添加了一个名为 _method 的隐藏输入来模拟动词 over
发帖。
:authenticity_token - 在表单中使用的真实性令牌。仅使用
如果您需要传递自定义真实性令牌字符串,或者不添加
authenticity_token 字段(通过传递 false)。远程表格可以
通过设置省略嵌入的真实性令牌
config.action_view.embed_authenticity_token_in_remote_forms = false。
当您对表单进行片段缓存时,这很有帮助。远程表格
从元标记中获取真实性令牌,因此嵌入是
除非您支持没有 JavaScript 的浏览器,否则不必要。
:remote - 如果设置为 true,将允许 Unobtrusive JavaScript
驱动程序来控制提交行为。默认情况下,此行为是
ajax 提交。
:enforce_utf8 - 如果设置为 false,则不会显示名为 utf8 的隐藏输入
输出。
任何其他键都会为标签创建标准 HTML 属性。
http://api.rubyonrails.org/v5.1/classes/ActionView/Helpers/FormTagHelper.html#method-i-form_tag
以下对我有用:
<%= form_tag({controller: 'search', action: 'confirm_new_search'},
method: 'post',
multipart: true) do %>
以下是您的 form_tag() 调用发生的示例:
def go(x={}, y={})
p x
p y
end
go(a: 1, b:2, c:3)
--output:
{:a=>1, :b=>2, :c=>3}
{}
因此,您为form_for() 指定的所有键/值对都被收集到一个散列中并分配给参数变量url_for_options。其结果是您的 form_tag() 没有将 html 选项 multipart 设置为 true。如果您查看 html 的源代码,您会看到:
<form action="/search/confirm_new_search?method=post&multipart=true"
accept-charset="UTF-8"
method="post">
如果您将该 html 与您的 form_tag() 通话进行比较:
form_tag(controller: 'search',
action: 'confirm_new_search',
method: 'post',
multipart: true)
很明显,最后两个键/值对被添加到 url 中的查询字符串中。该行为似乎没有在任何地方记录,但规则似乎是:对于url_for() 无法识别的任何键,该键和相应的值被添加到查询字符串中。而且,查询字符串中的键/值对与<form> 标记的html 属性无关。