標記の件について質問させていただきます。
RailsとVue.jsで自作アプリを開発しております。
現状・実現したいこと
【現状】
アプリは正しい挙動をしているのにも関わらず、現在、ブラウザのConsoleに上記のエラーがでております。
【実現したいこと】
このエラーを解消したい。
該当のソースコード
app/controllers/api/items_controller.rb
Ruby
1class Api::ItemsController < ApplicationController 2 require "date" 3 4 def index 5 @random_items = fetch_items 6 end 7 8 def update 9 @selected_id = params[:id] 10 # idを頼りに該当のitemを探す 11 @selected_item = Item.find(@selected_id) 12 # そのアイテムのpointsカラムに+1 13 @selected_item.points += 1 14 # 保存 15 @selected_item.save 16 17 @random_items = fetch_items 18 # JSON形式で出力する 19 render json: @random_items 20 end 21 22 private 23 # fetchとは呼び出すこと 24 # 今現在、開催中の大会から、2つのitemの呼び出す 25 def fetch_items 26 in_session_competition = 27 Competition.find_by(period_start: -Float::INFINITY..Date.today, period_end: Date.today..Float::INFINITY) 28 29 # 今日開催中の大会のitemsをRANDOMメソッドで並び替え、その中の2つを@random_itemsに入れて、テンプレートへ渡す 30 in_session_competition.items.order("RANDOM()").limit(2) 31 end 32end 33
app/views/home/index.html/erb
<h1 id="heading">Click either you "like".</h1> <div id="app"> <div id="pictures"> <div id="picture" v-for="item in items"> <!-- @click.preventとすることで画面遷移させない--> <!-- clickしたときは、updataItemが発火--> <a @click.prevent="updataItem(item.id)"> <!-- public/item_images の中に画像を格納しておく。--> <!-- DBには画像のデータの名前を入れておく--> <img :src="'/item_images/' + item.image" width="500px" height="500px"/> <div> {{item.name}} </div> </a> </div> </div> </div> <script> new Vue({ el: "#app", data() { return { // itemsは配列でくるから、配列を定義しておく items:['',''], } }, mounted() { this.setItems(); }, methods: { // setCompetitionsメソッドを定義 setItems: function () { // GETメソッドでapi/itemsとしたとき // ここには、json形式になった@random_itemsがある(index.json.jbuilderで定義した) axios.get('/api/items') // 成功したら、 .then(response => ( // Axiosで呼び出したAPIの情報をitemsに格納 this.items = response.data )) }, // itemをクリックしたとき、そのクリックしたほうのitemのidが渡って来る updataItem: function(item_id){ // PUTメソッドでapi/items/item_idとする axios.put('api/items/'+item_id) // 上が成功したら .then(response => ( // Axiosで呼び出したAPIの情報をitemsに格納 this.items = response.data )) } } }); </script>
app/views/api/items/index.json.jbuilder
json.array! @random_items, :id,:name, :image,:points,:competition_id
config/routes.rb
Rails.application.routes.draw do root 'home#index' resources :competitions,only:[:index,:show] namespace :api,format:'json' do resources :items,only:[:index,:update] end end
試したこと
- ログの確認
log
Started GET "/item_images/undefined" for ::1 at 2021-01-08 05:51:00 +0900 ActionController::RoutingError (No route matches [GET] "/item_images/undefined"):
ログを確認したところ、やはりエラーがでてました。getリクエストで/items_images/undefindeがない。とのことで、undefinde(本来であれば、画像の名前が乗ってくる箇所)になっていることが原因だと思いました。
- 怪しい箇所を削除
app/views/home/index.html.erb
<img :src="'/item_images/' + item.image" width="500px" height="500px"/>
上記の行を削除したところ、item_images/undefinedのエラーは消えました。
ということはこのitem.image
がundefindだからエラーが出るのかなと思います。
しかし、先述したとおり、正しい挙動しており、該当箇所にもデータが渡ってきております(画像が表示されているため)。
お忙しいところ、恐縮ですが、ご教示いただければ、幸いです。
補足情報(FW/ツールのバージョンなど)
- ruby 2.7.0p0
- Rails 6.1.0
- sqlite
回答1件
あなたの回答
tips
プレビュー