rails 独学して軽くにちゃんまとめつくる

【rails】 image_tag でデフォルト画像を設定したいとき

2パターンに状況がわかれる

①carrierwave を使って画像アップロード機能を作っているとき

②なにも gem をつかっていないとき

 

 

①については carriewave の設定で対処することができる

carrierwaveで作成したアップローダーファイルが app/uploaders/ picture_uploader.rb にあるのでそれを開く。(picture_uploader.rb というのは ぼくが carrierwave の作成時に決めた名前なので違う名前で保存されてるかもしれない)

 

②このコードを張り付ける

  def default_url
    "default.jpg"
  end

 

これで carrierwave は  app/assets/images/default.jpg にある画像を探してくれる。もしユーザー側でなにかアップロードしてきたらアップロードしてきた画像を表示するという柔軟性をもっている。

 

③ default.jpg という名前で app/assets/images/ に保存する。

 

ーーーーーーーーーーーー

 

②ふつうにするとき

 

これはあっさりしてるが、 model の migration で設定しておけばいい。今回はUser モデルのにある pic カラムにプロフィール画像のデフォルト画像を設定するという状況を考える。

rails g migration AddDefaultPicToUsers

 

class AddDefaultPicTo4Users < ActiveRecord::Migration[5.0]
  def change
    change_column :users, :pic, :string, default: "default.jpg" 
  end
end

 

 

として rails db:migrate をする。 User 側で保存してるのは 'default.jpg' という文字列だけだが、 image_tag user.pic とすると app/assets/images/default.jpg にある画像をもってきてくれるというちょっと荒業を紹介した。

 

ちなみにこの技は carrierwave を使っていると使えない。

carrierwave を使っているとき、uploader の store_dir というメソッドで設定したファイルをもとに画像をさがすので見当違いの場所を参照するようになる。アップロードした画像がなぜか文字になってしまう~というのはこれが原因だ。