よろしくお願い致します。
carrierwaveにて画像upload機能を実装しました。
通常特に問題なく動いているのですが、次の一定の条件の場合のみ画像のuploadができない状況です。
・確認画面のあるブログ機能で、画像のupdateを行う場合
確認画面に新しい画像が表示されるのですが、デバッグツールで確認すると、
確認画面のアクションが起こった時点で画像は以前のものが捕まえられているという状況です。
もっと言えば、一度saveしたblogオブジェクトの画像データを、
コンソール上で削除しようとすると、
blog = Blog.last => #<Blog:0x007fc15d46d928 id: 44, title: "test", content: "テストtest", created_at: Tue, 30 Jan 2018 14:33:54 JST +09:00, updated_at: Wed, 31 Jan 2018 16:25:19 JST +09:00, user_id: 2, image: "卵からかえったひよこ.jpeg"> pry(main)> blog.image = nil => nil pry(main)> blog => #<Blog:0x007fc15d46d928 id: 44, title: "test", content: nil, created_at: Tue, 30 Jan 2018 14:33:54 JST +09:00, updated_at: Wed, 31 Jan 2018 16:25:19 JST +09:00, user_id: 2, image: "卵からかえったひよこ.jpeg">
この通り、一回nilになっているにもかかわらず実際には消えていない、という状況です。
※確認画面のない投稿機能ではupload可能
※確認画面のあるブログ機能の新規登録時はupload可能
画面は次のような遷移です。
編集画面→確認画面→投稿完了(ブログ一覧)画面
確認画面ではhidden_fieldで情報を持たせています。
コードは次のように書いています。
_form.html.erb(新規投稿時と共有)
<%= form_with(model: @blog, local: true, url: url_new_or_edit, method: method_new_or_edit ) do |form| %> <!--url/methodはhelper参照--> <% if @blog.errors.any? %> <div class="errors"> <p><%= @blog.errors.count %>件のエラーがあります。</p> <ul> <% @blog.errors.full_messages.each do |msg| %> <li><%= msg %></li> <% end %> </ul> </div> <% end %> <section class="form row"> <div class="title"><%= form.label :title %></div> <div class="content"><%= form.text_field :title, class: 'text-title' %></div> <div class="title"><%= form.label :content %></div> <div class="content"><%= form.text_area :content, class: 'text-content' %></div> <div class="image"><%= form.file_field :image, :multipart => true %></div> <%= form.hidden_field :image_cache %> </section> <ul class="edit-menu form-menu"> <li><%= form.submit "Confirm...", id: 'btn' %></li> </ul> <% end %>
_confirmation.html.erb(新規投稿時と共有)
<%= form_with(model: @blog, local: true) do |form| %> <%= form.hidden_field :title %> <%= form.hidden_field :content %> <%= form.hidden_field :image %> <section class="form row"> <div class="title"><%= form.label :title %></div> <div class="content"><%= @blog.title %></div> <div class="title"><%= form.label :content %></div> <div class="content"><%= simple_format(@blog.content) %></div> <div class="image"><%= image_tag @blog.image.url, class: "blog-image" %></div> <%= hidden_field_tag :"cache[image]", @blog.image.cache_name %> </section> <div class="confirm-submit-btn"> <ul class="edit-menu col-md-2 col-sm-12"> <li><%= form.submit "Submit.", id: 'btn' %></li> </ul> </div> <% end %>
blogs.controller.rb
def create @blog = current_user.blogs.new(blog_params) @blog.image.retrieve_from_cache!(params[:cache][:image]) if @blog.save NoticeMailer.notice_mail(@blog).deliver flash[:notice] = "新しい記事\"#{@blog.title}\"を投稿しました。" redirect_to blogs_path else render "new" end end def update @blog.image.retrieve_from_cache!(params[:cache][:image]) if @blog.update(blog_params) flash[:notice] = "記事\"#{@blog.title}\"を編集しました。" redirect_to blogs_path else render "edit" end end
何かお分かりの方がいらっしゃいましたら、どうぞよろしくお願い致します。
あなたの回答
tips
プレビュー