

Ruby on Rails4でアプリ開発しています。

今回、画像アップロード機能を実装するためcarriewaveを導入しました。

画像アップロードはブログ機能につけて、ブログ記事と画像(任意)で投稿できるようにしました。

投稿の際はnew→confirm→cretaeと遷移して確認画面を経由して投稿できるようにしました。

**問題点**  
画像は任意で登録できるようにしたいのですが、画像をアップロードしない場合にエラーになってしまいます。

[code]

    # エラーメッセージ
    CarrierWave::InvalidParameter at /topics
    invalid cache id
    
[/code]

画像をアップロードする際は正常に動きます。

現在コードはこのように記述しています。

`_form.html.erb`

[code]

    #省略
      <%= f.label :アップロード写真 %>
      <%= f.file_field :photo %>
      <%= f.hidden_field :photo_cache %>
    #省略
    
[/code]

`confirm.html.erb`

[code]

    #省略
      <%= image_tag (@topic.photo.url) if @topic.photo.present? %>
      <%= hidden_field_tag :"cache[photo]", @topic.photo.cache_name %>
    #省略
    
[/code]

`topics_controller`

[code]

    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
    
[/code]

どのように修正すればいいかご教授お願いします。

・追記  
エラー時のログはこのようになっています。

[code]

    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'
     ・・・
      # 省略
    
[/code]


CC BY-SA 3.0
2017-04-07T14:40:19.527
33844
2020-03-18T04:04:35.630
2017-04-09T05:24:44.243
21311
21311
question
ruby-on-rails ruby rubygems
Railsでcarriewaveを使用して画像をアップロードする


下記のような形で画像がある時だけ処理を加えてやるのではダメなのでしょうか？

`@topic.photo.retrieve_from_cache! params[:cache][:photo] if
params[:cache][:photo].present?`


CC BY-SA 3.0
2017-11-09T05:00:38.577
39442
2017-11-09T05:00:38.577
26116
33844
answer