nested_form_forでmultipartを設定するときの書き方

form_withだと

= form_with multipart: true do |f|

みたいな感じでそのまま書けば画像をアップロードできる。

nested_form_forの場合

= nested_form_for :html => { multipart: true } do |f|

こうするとアップロードできる。

:htmlってなんなのか

nested_form_forのメソッドはいまいちわからなかったけど、form_withのやつは見つけた。

def form_with(model: nil, scope: nil, url: nil, format: nil, **options, &block)
    options = { allow_method_names_outside_object: true, skip_default_ids: !form_with_generates_ids }.merge!(options)

    if model
      if url != false
        url ||= polymorphic_path(model, format: format)
      end

      model   = _object_for_form_builder(model)
      scope ||= model_name_from_record_or_class(model).param_key
    end

    if block_given?
      builder = instantiate_builder(scope, model, options)
      output  = capture(builder, &block)
      options[:multipart] ||= builder.multipart?

      html_options = html_options_for_form_with(url, model, **options)
      form_tag_with_body(html_options, output)
    else
      html_options = html_options_for_form_with(url, model, **options)
      form_tag_html(html_options)
    end
  end

:html => {}は**optionsのとこで受け取られるということまではわかった。

chatGPTによると、HTMLの属性をカスタマイズするためのものらしい。

詳しい中身まではわからなかったけど、ある程度の動作はこれで理解できた。

form_tag_with_bodyのところでいろいろ生成してるのだろうという読み。