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のところでいろいろ生成してるのだろうという読み。