ファイル入力フィールドを備えた Rails フォーム - ファイル名を文字列として指定するだけ

概要

フォームにファイル入力フィールドを埋め込みたいと考えています。 ただし、送信時には、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&amp;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() が認識しないキーについては、キーと対応する値がクエリ文字列に追加されます。また、クエリ文字列内のキーと値のペアは、

タグの HTML 属性とは何の関係もありません。