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」
- 「multipart: true」でマルチパートを認識可能に
- Rails4以降のform_forやform_withでは省略可能に
【本題】
form_forやform_withのオプションである「multipart」
form_forやform_withのオプションの中には、
「multipart」というものがあります。
これは、マルチパートを指定するオプションです。
マルチパートとは、画像やCSVなどのデータの種類を指します。
もし、このマルチパートの指定をしていないと、
ファイルを読み込んでも、ファイル名をただの文字列と認識してしまい、
ファイルを画像やCSVとして取り込む事が出来ません。
例えば、「image.jpeg」という画像ファイルを取り込んでも、
「image.jpeg」という文字列として認識されてしまいます。
「multipart: true」でマルチパートを認識可能に
画像を画像として、CSVをCSVとして取り込みたい場合は、
「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 %>