patorashのブログ

方向性はまだない

simple_formを使ってActiveStorageのダイレクトアップロードを行う

引き続き、ActiveStorageネタです。 simple_formを使ってActiveStorageのdirect_uploadの設定を書くと、うまくいきません…。

= simple_form_for(@post) do |f|
  / 略
  .form-inputs
    / 動くけれどダイレクトアップロードにはならない…
    = f.input :images, as: :file, direct_upload: true, input_html: { multiple: true, accept: 'image/*' }

どうもdirect_upload: trueの部分が関係ないものとして無視されてしまうようです。 しかしもう既にActiveStorageが出てから随分経っているので、なんかいい方法あるだろうとググったら、stack overflowにありました。

stackoverflow.com

simple_formのカスタムインプットクラスを作る方法です。app/inputs/direct_upload_file_input.rbを作って、以下のコードを貼ります。

# frozen_string_literal: true

class DirectUploadFileInput < SimpleForm::Inputs::FileInput
  def input_html_options
    super.merge({ direct_upload: true })
  end
end

そして、ビューを修正します。

= simple_form_for(@post) do |f|
  / 略
  .form-inputs
    / ダイレクトアップロードになった!
    = f.input :images, as: :direct_upload_file, input_html: { multiple: true, accept: 'image/*' }

エラーメッセージも綺麗に出るようになったので、こっちのほうがいいですね。