tl;dr
carrierwave + 確認画面 = retrieve_from_cache!
どうかくのか
確認画面を挟まないnew~craete~show~edit~updateの流れが出来ている前提。つまりcarrierwave導入済みの状態を前提とする。
view
<%= form_with ... do |f| %> <%= f.file_field :upload_file %> <% end %>
<%= form_with ... do |f| %> <%= f.hidden_field :file_cache_id, value: f.object.upload_file.cache_name %> <%# 追加 %> <% end %>
model
class Document < ApplicationRecord belongs_to :article attr_accessor :file_cache_id # 追加 mount_uploader :upload_file, DocumentUploader
controller
class ArticleController < ApplicationController def create article_params[:documents_attributes].each do |key, value| document = @article.documents.find { |d| d.id == value[:id] } document ||= @article.documents.build document.upload_file = nil document.upload_file.retrieve_from_cache! value[:file_cache_id] end @article.save! ..... # 以下略 end end
memo
どこのタイミングでやるのがいいのか判断に迷ったのでしれっとコントローラに混ぜてしまった。nested_attributesだったりする特殊なコントローラなので素直にやればparamsをeachでこねくりまわす必要もないと思う。PJ内のコードから一部抜き出してそれっぽくしただけなので動かないかもしれない。その時は編集リクエストなどで修正をお願いしたい。
あとがき
日本人(特に歴史のある団体)というのは確認画面を重視する。確認画面より編集しやすいUIが必要なのではないかとは思うがそこは主旨から外れるので置いておくとして、これ、マジでいるのかな…と思いながら作っている。