感情的ドリル

Ruby県から飛び出して関東にきたオタク

carrierwaveを利用したファイルアップロードで確認画面を挟む

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が必要なのではないかとは思うがそこは主旨から外れるので置いておくとして、これ、マジでいるのかな…と思いながら作っている。