質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

89.20%

Need to implement #cache! のエラーに困っています。

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 650

dean

score 5

carrierwave、cloudinaryで画像の保存

Ruby(Rails)、CarrierWave、cloudinary、Herokuでユーザー画像の登録、変更を行おうとしています。
開発環境(storage:file)ではうまくいったのですが、Herokuにあげたところ「登録ボタン」を押したところで詰まってしまいました。
Heroku logs —tailで確認したところ、タイトルのエラーがでてきました。

発生している問題・エラーメッセージ

2019-09-16T11:31:56.239436+00:00 heroku[router]: at=info method=POST path="/users/1" host=s-labo.herokuapp.com request_id=60099362-dc59-4b25-93a8-a898cf9e1b58 fwd="106.154.133.151" dyno=web.1 connect=0ms service=211ms status=500 bytes=1827 protocol=https
2019-09-16T11:31:56.232616+00:00 app[web.1]: [60099362-dc59-4b25-93a8-a898cf9e1b58] Started PATCH "/users/1" for 106.154.133.151 at 2019-09-16 11:31:56 +0000
2019-09-16T11:31:56.233369+00:00 app[web.1]: [60099362-dc59-4b25-93a8-a898cf9e1b58] Processing by UsersController#update as HTML
2019-09-16T11:31:56.233485+00:00 app[web.1]: [60099362-dc59-4b25-93a8-a898cf9e1b58]   Parameters: {"utf8"=>"✓", "authenticity_token"=>"tj2LhOfRFuWpTgXKX6gz5Ox4e8a6KZgBmmrB+IQ2b5nkMYqk7Izm4h9f7KiwXrvFpISiiP4qnwd9b9MWXjIwHw==", "user"=>{"image"=>#<ActionDispatch::Http::UploadedFile:0x0000558e8d1642b8 @tempfile=#<Tempfile:/tmp/RackMultipart20190916-4-jvq7mb.png>, @original_filename="wonderful-minimalist-wallpaper-2560x1600.png", @content_type="image/png", @headers="Content-Disposition: form-data; name=\"user[image]\"; filename=\"wonderful-minimalist-wallpaper-2560x1600.png\"\r\nContent-Type: image/png\r\n">, "image_cache"=>"", "name"=>"testテスト", "introduce"=>"自己消火器"}, "commit"=>"登録", "id"=>"1"}
2019-09-16T11:31:56.237144+00:00 app[web.1]: [60099362-dc59-4b25-93a8-a898cf9e1b58]   User Load (1.2ms)  SELECT  "users".* FROM "users" WHERE "users"."id" = $1 LIMIT $2  [["id", 1], ["LIMIT", 1]]
2019-09-16T11:31:56.238743+00:00 app[web.1]: [60099362-dc59-4b25-93a8-a898cf9e1b58]    (1.0ms)  BEGIN
2019-09-16T11:31:56.241253+00:00 app[web.1]: [60099362-dc59-4b25-93a8-a898cf9e1b58]    (1.0ms)  ROLLBACK
2019-09-16T11:31:56.241644+00:00 app[web.1]: [60099362-dc59-4b25-93a8-a898cf9e1b58] Completed 500 Internal Server Error in 8ms (ActiveRecord: 3.2ms)
2019-09-16T11:31:56.242161+00:00 app[web.1]: [60099362-dc59-4b25-93a8-a898cf9e1b58]
2019-09-16T11:31:56.242190+00:00 app[web.1]: [60099362-dc59-4b25-93a8-a898cf9e1b58] NotImplementedError (Need to implement #cache! if you want to use Cloudinary::CarrierWave::Storage as a cache storage.):

該当のソースコード

image_uploader.rb

class ImageUploader < CarrierWave::Uploader::Base

  include CarrierWave::RMagick

  if Rails.env.production?
    include Cloudinary::CarrierWave
  else
    storage :file 
  end 

  def store_dir
    "uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}"
  end


edit_form.html.erb

    <%= form_with(model: @user, local: true) do |f| %>
<div class="row">
        <div class="offset-lg-1 col-lg-4">
            <%= render 'layouts/error_messages', model: f.object %>
            <div class="form-group">
                <div class="card">
                    <div class="card-header">
                        <%= f.label :image, 'クリックで画像変更' %>

                        <div id="img_field" onClick="$('#file').click()" >
                        <% if @user.image.url.present? %>
                          <%= image_tag @user.image.thumb.url, :size =>'180x150' %>
                        <% else %>
                          <%= image_tag 'no_image.jpg', :size =>'180x150' %>
                        <% end %>
                        </div>
                        <%= f.file_field :image, class: "image", style: "display:none;", id: "file" %>
                        <%= f.hidden_field :image_cache %>
                    </div>
                </div>
            </div>
        </div>

        <div class="col-lg-6">   
            <div class="form-group">
                <%= f.label :name, '名前' %>
                <%= f.text_field :name, class: 'form-control' %>
            </div>

            <div class="form-group">
                <%= f.label :introduce, '自己紹介' %>
                <%= f.text_area :introduce, rows: 5, class: 'form-control' %>
            </div>      
        </div>

試したこと

一度、上記のimage_uploaderの中からinclude Cloudinary::CarrierWaveだけを残し、ほかをコメントアウトした上でローカル環境で試してみましたがうまくいきませんでした。 

image_cacheが渡っていないのかと思い、strong parameterを変更しましたがうまくいきません

def user_params
  params.require(:user).permit(:name, :email, :introduce, :password, :password_confirmation, :image, :image_cache)
end 


ローカル環境でも同様に

Need to implement #cache! if you want to use Cloudinary::CarrierWave::Storage as a cache storage.


と表記されました。cacheに関わる部分を実装するのかとは思うのですが、どこに何を実装すればよいのかわかりません。

追記
Completed 500 Internal Server Errorに注目し、文法ミスかと思いfoamやコントローラも見直しました。
Storage:fileでは保存できたので、cloudinaryの設定かとも思いましたが、その場合どこを操作すれば良いのかわかりませんでした。

補足情報(FW/ツールのバージョンなど)

ruby '2.5.3'
gem 'rails', '~> 5.2.2'
gem 'cloudinary'
gem 'carrierwave'
gem 'rmagick'

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

0

最新の carrierwave, cloudinary のバージョンの兼ね合いでの問題があるかもしれません。

gem 'carrierwave', '~> 1.3.1'
gem 'cloudinary' , '1.11.1'


gemfileの記述を変えてbundle installすれば解決できる可能性があります。
上記を実行する場合、

if Rails.env.production?
 include Cloudinary::CarrierWave
else
 storage :file 
end


質問者様のコードのままで大丈夫かと思います。

当方、学習中の初心者で大変恐縮ですが、同じようなエラーが出た経験があり、上記の方法で解決したため、回答させて頂きました。
一度、ご確認頂ければと思います。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/09/21 07:41

    ご回答ありがとうございます!
    バージョンを変更してみたところ、「Need to implement #cache!」はなくなったのですが、URI::InvalidURIError in UsersController#update」が出てしまいました。
    もし何かお分かりになることがあれば教えていただきたいです。

    キャンセル

  • 2019/09/21 09:15

    失礼しました。他サイトを参考に作ったcloudinary.rbの環境変数が邪魔していたのでコメントアウトしたところ解決しました。
    数日悩んでいたことがようやく一歩進みました。ありがとうございます!

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 89.20%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる