file_fieldがある時、form_forやform_with はmultipart: trueが省略できる

【結論】

・multipartとは、form_forやform_withにおいて
 マルチパートを指定するオプション

・マルチパートの指定は、
 画像やCSVなどのファイルを読み込む際に必要で、
 「multipart: true」と記述する

・Rails4以降のform_forやform_withでは、
 フォーム内に関連付けられた「file_field」がある場合は、
 自動的に「multipart: true」が適用されるので、
 記述の省略が可能

【目次】

【本題】

form_forやform_withのオプションである「multipart」

form_forやform_withのオプションの中には、
「multipart」というものがあります。

これは、マルチパートを指定するオプションです。

マルチパートとは、画像やCSVなどのデータの種類を指します。

もし、このマルチパートの指定をしていないと、
ファイルを読み込んでも、ファイル名をただの文字列と認識してしまい、
ファイルを画像やCSVとして取り込む事が出来ません。

例えば、「image.jpeg」という画像ファイルを取り込んでも、
「image.jpeg」という文字列として認識されてしまいます。

「multipart: true」でマルチパートを認識可能に

画像を画像として、CSVCSVとして取り込みたい場合は、
「multipart: true」と記述して、マルチパートの指定を行います。

こうする事で、ファイルそのものを正しく読み込む事が可能になります。

Rails4以降のform_forやform_withでは省略可能に

なお、この「multipart: true」ですが、
Rails4以降では省略可能になっています。

下記の様に、関連付けられた「file_field」が存在すれば、
自動的に「multipart: true」が適用されます。

<%= form_with url: import_csv_path, local: true do |f| %>
  <%= f.file_field :file %>
  <%= f.submit t('common.button.import') %>
<% end %>

なお、下記の様に「file_field」が関連付けられていない場合(f.が無い)や、
そもそも「file_field」が無い場合には、「multipart: true」を設定する必要があります。

<%= form_with url: import_csv_path, local: true, multipart: true do %>
  <%= file_field_tag :file %>
  <%= submit_tag t('common.button.import') %>
<% end %>