フォームにファイル入力フィールドを埋め込みたいと考えています。 ただし、送信時には、param 値は単なるファイル名であり、StringIO などはなく、ファイル名を含む文字列だけです。
形状:
<%= form_tag(controller: 'search', action: 'confirm_new_search', method: 'post', multipart: true) do %>
[....]
<div class="custom-file field" id="inc_form">
<%= file_field :post, :file_inc_sellerslist, class: "custom-file-input" %>
<label class="custom-file-label" for="file_inc_sellerslist">
<%= t('dashboard.new_search.extra_search_options_entries.choose_file') %>
</label>
</div>
[....]
何が間違っているのでしょうか?
form_tag() 構文が正しくありません。 form_tag は 2 つのハッシュを引数として受け取ります。1 つは URL 用、もう 1 つは 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)
最後の 2 つのキーと値のペアが URL
のクエリ文字列に追加されていることは明らかです。その動作はどこにも文書化されていないようですが、ルールは次のようです:
url_for()
が認識しないキーについては、キーと対応する値がクエリ文字列に追加されます。また、クエリ文字列内のキーと値のペアは、