Railsでcarriewaveを使用して画像をアップロードする
Ruby on Rails4でアプリ開発しています。
今回、画像アップロード機能を実装するためcarriewaveを導入しました。
画像アップロードはブログ機能につけて、ブログ記事と画像(任意)で投稿できるようにしました。
投稿の際はnew→confirm→cretaeと遷移して確認画面を経由して投稿できるようにしました。
問題点
画像は任意で登録できるようにしたいのですが、画像をアップロードしない場合にエラーになってしまいます。
# エラーメッセージ
CarrierWave::InvalidParameter at /topics
invalid cache id
画像をアップロードする際は正常に動きます。
現在コードはこのように記述しています。
_form.html.erb
#省略
<%= f.label :アップロード写真 %>
<%= f.file_field :photo %>
<%= f.hidden_field :photo_cache %>
#省略
confirm.html.erb
#省略
<%= image_tag (@topic.photo.url) if @topic.photo.present? %>
<%= hidden_field_tag :"cache[photo]", @topic.photo.cache_name %>
#省略
topics_controller
class TopicsController < ApplicationController
def new
if params[:back]
@topic = Topic.new(topics_params)
else
@topic = Topic.new
end
end
def create
@topic = Topic.new(topics_params)
@topic.photo.retrieve_from_cache! params[:cache][:photo]
@topic.save!
@topic.user_id = current_user.id
respond_to do |format|
if @topic.save
format.html { redirect_to @topic, notice: '投稿しました!' }
format.json { render :show, status: :created, location: @topic }
else
format.html { render :new }
format.json { render json: @topic.errors, status: :unprocessable_entity }
end
end
end
def confirm
@topic = Topic.new(topics_params)
render :new if @topic.invalid?
end
# 一部省略
private
def topics_params
params.require(:topic).permit(:title, :content, :photo_cache, :photo, :tag_list)
end
def set_topic
@topic = Topic.find(params[:id])
end
end
どのように修正すればいいかご教授お願いします。
・追記
エラー時のログはこのようになっています。
Started POST "/topics" for ::1 at 2017-04-09 14:16:58 +0900
Processing by TopicsController#create as HTML
Parameters: {"utf8"=>"✓", "authenticity_token"=>"3YIrH2Y/s/011pnlah8L6LFvGGdDzUmIFhxw28WvHDHG04r8DLH4taSgS+WIhUPAFapQrDZP1YzWcGWQgXv95Q==", "topic"=>{"title"=>"hoge", "content"=>"hoge", "tag_list"=>"huga"}, "cache"=>{"photo"=>""}, "commit"=>"投稿する"}
User Load (0.3ms) SELECT "users".* FROM "users" WHERE "users"."id" = $1 ORDER BY "users"."id" ASC LIMIT 1 [["id", 3]]
(0.2ms) SELECT COUNT(*) FROM "notifications" WHERE "notifications"."user_id" = $1 AND "notifications"."read" = $2 [["user_id", 3], ["read", "f"]]
Completed 500 Internal Server Error in 7ms (ActiveRecord: 0.5ms)
CarrierWave::InvalidParameter - invalid cache id:
carrierwave (1.0.0) lib/carrierwave/uploader/cache.rb:193:in `cache_id='
carrierwave (1.0.0) lib/carrierwave/uploader/cache.rb:158:in `block in retrieve_from_cache!'
carrierwave (1.0.0) lib/carrierwave/uploader/callbacks.rb:15:in `with_callbacks'
carrierwave (1.0.0) lib/carrierwave/uploader/cache.rb:157:in `retrieve_from_cache!'
app/controllers/topics_controller.rb:31:in `create'
actionpack (4.2.3) lib/action_controller/metal/implicit_render.rb:4:in `send_action'
・・・
# 省略