Cloudinary + Carrierwave + Heroku + Railsでの画像を手軽に利用する方法
Rails5とCarrierWaveを使って画像アップロード機能を作る
rails "undefined method '**_image will_change!' エラーの対処 【carrierwave】
**基本的には、これらのページ様の通りに行えばできます。簡単なはずです。**でも自分は迷走し、時間を食いました。そのために備忘録として残しておきたいというのが、1つです。
そしてはじめて本格的?にチュートリアル以外の事やった(※実装中はRailsTutorialにほぼ同じ内容が有ることを知らなかった)んで記念に書きました。
※Cloudinaryを用いるにはherokuにクレカを登録しなければなりません。必要ですクレカ。
#ハマった箇所
- 画像を格納するカラムの名前(プロダクション環境)
- rmagickをCloud9にインストール (※不要だった?)
##カラムの名前
画像が格納されるカラムの名前を image にしてはならない
なぜなら、画像を格納されるカラムの名前を image にすると
プロダクション(heroku上)環境では、NoMethodError undefined method image will_change!
というエラーが発生するからです。
開発中は問題なく画像UPできますしCloudinaryにも問題なく画像が上がってたので、デプロイしてから気付いたんですね…
このエラーに関しては上の3つ目のURLによって救われました。当該URLでは新たなカラムを追加する事によって対処されているようですが、私の場合はリネームで対処しました。
リネームは
$ rails g migration rename リネームしたいカラムの名前_column_to_テーブル名
というような形でマイグレーションファイルを作成し
マイグレーションファイルの内部で
rename_column :テーブル名, :現在のカラム名, :変更後のカラム名(を入力)
とする事によってカラムのリネームを行えます。
私の場合はpostsテーブルにimageという名前のカラムを作成していましたので、その名前を変更しました。
class RenameImageColumnToPosts < ActiveRecord::Migration[5.2]
def change
rename_column :posts, :image, :picture
rename_column :posts, :remove_image, :rem_picture
rename_column :posts, :image_cache, :picture_cache
end
end
###アップローダーも名前変更
同時に、既に作成したアップローダーも一旦デストロイします。(リネームという発想がなかった)
$ rails destroy uploader Image
アップローダーの名前をPictureとして、再度作成
$ rails g uploader Picture
そして忘れずに
$ rails db:migrate
を行いました。これで、実際にリネームされ、エラーも解消されました。
もちろん画像もUPできました!やったね!
リネームについては以上です。
##コントローラ(念の為)
最初に掲げたURLではコントローラについては言及されていません。
しかし私のような間抜けは慣れない事をやるとMVCという前提すら失念し、ストロングパラメータにpictureを加えることを忘れます。本記事は備忘録なので書いておきます。
※私の作成したアプリ内のPostモデルはUserとTopicの2つのモデルにbelongs_toしています。
def set_post_params
params.require(:post).permit(:content, :topic_id, :user_id, :picture) #pictureを追加。
end
ビューの方もimageからpictureに名前を変えます。
form_for内
<%= f.file_field :picture, id: :picture %>
<% @posts.each do |post|%>
中略
<%= image_tag(post.picture_url) %>
中略
物忘れって怖いですね。
##rmagickをCloud9にインストール
[Gem] RMagick をCentOSでインストール
こちらを参考にさせて頂き、無事解決しました。つまりrmagickをインストールできました。
時間食った理由ですが、最初に
とか言われたからなんですね。apt-get使えないんですよ。CentOSとかよく知りませんが、事実として、私のCloud9環境ではapt-getと書かれているコマンドは実行できなかった模様です。
ググって出てくる優良ページ、みんなapt-getですからね…
RailsTutorial13章後半にもありますが
$ sudo yum install -y ImageMagick
でもOKです。
#おわりに
なんでカラム名をimageにするとエラーが発生するのか、わかりません。偉大なるRails様やCarriewave様、Cloudinary様が色々とよしなにやってくれるからなんですかね…
いずれにせよ、ググって出てくるサイトでは、画像格納カラムの名前をimageとしている所を幾つか見受けましたが、imageにするとダメでした。少なくとも、私の場合は。