Railsアプリ内でVueを使用し、SPAを実装しました。
その中で、VueからRailsのactive_storageを使おうと思いましたがそれっぽい方法を見つけられず、自分でとりあえず実装してみたので残します。
プログラミング初心者かつVue自体も初めてなので間違いもだいぶあると思います。見つけたら指摘していただいたら嬉しいです。
version
Rails 6.0.3.2
ruby 2.6.3
@vue/cli 4.4.1
active_storageに保存するまでは
https://qiita.com/ozin/items/5ec81a4b126b8ebf7a96
この記事でやりました。
このあとvue側に表示するまでを書きます。Vueでは単一ファイルコンポーネントで実装しています。
ライブラリのインストール方法は省略します。
モデル
diary.rb
has_one_attached :image
# 省略
コントローラ
diaries_controller.rb
def index
diaries = Diary.all
diaries_array = []
diaries.each do |d|
hash = d.attributes # インスタンスをハッシュにする
if d.image.attached?
# imageのパスを取得
image = Rails.application.routes.url_helpers.rails_blob_path(d.image)
hash["image"] = image # ハッシュに新しいkeyと値を追加
else
hash["image"] = ''
end
diaries_array << hash # 配列にハッシュを要素として追加
end
render json: diaries_array
end
axiosでリクエストを送る
diareis.vue
// 省略
<script>
export default {
data: function() {
return {
diaries: ''
}
},
mounted() {
let that = this;
axios.get('/APIなどのパス/').then(function(response) {
that.diaries = response.data;
}
}
}
<script>
バインドして表示
diaries.vue
<template>
<div>
<div v-for='diary in diaries' v-bind:key='diary.id' >
<div v-if='diary.image'>
<img v-bind:src="diary.image">
</div>
</div>
</div>
</template>
これで表示できました。
指摘などありましたらお願いします!