はじめに
画像ファイルを複数登録するときに、multipleを使うと簡単に実装できます。
が、(自分の環境だけなのか)保存されるデータに含まれる画像ファイル名に
[ ]がついてしまい、実際に保存されている画像ファイル名を齟齬が生じ
エラーとなる自体が発生していました。
そこで、Model側にこれを取り除くメソッドを追加しましたが、同じような環境で
困っている方はご利用ください
最近、某プログラミングスクールではこれの影響なのかmultipleを使わないようにと
御達しが出たようですね。
前提条件
ItemモデルはImagesを複数持つアソシエーションが組まれていること
コード
class Image < ApplicationRecord
belongs_to :item, optional: true
validates_presence_of :item
mount_uploaders :image_url, ImageUploader
def image_path
return '' if self.image_url[0].try(:file).nil?
if Rails.env.production?
self.image_url[0].url.gsub(/%5B%22/, "").gsub(/%22%5D/, "")
else
self.image_url[0].file.file.sub(/.*public/,'').sub(/\["/,'').sub(/"\]/,'')
end
end
end
今回はS3に画像を保存するようにしており、本番環境とローカルでは指定する画像パスが異なってくるので
production?を使って分岐させています。
使い方
def show
@item = Item.find_by(id: params[:id])
@image_path = @item.images.map{|img| img.image_path}
end
paramsで渡されたidのアイテムを@itemに格納し、@itemのimagesに対して
modelで作成したimage_pathメソッドを実行して[ ]を削除したパスを@image_pathに
格納して使えるようにします。
あとはビュー側でimage_tagに@image_path[n]とすれば格納したパスを
取り出すことができます。@image_pathは配列になっていることに注意です。
おわりに
細かいことですが、私は最初Controllerに[ ]を取り除く処理を書いていましたが、メンバーが
MVCモデルの法則に則ってModelにメソッドを書き直してくれました。
開発の基準をしっかりと把握していないと他のメンバーに迷惑をかけてしまいますね・・・猛省