現状・実現したいこと
標記の件について質問させていただきます。
【現状】
現在、画面には、DB内にある画像データを2つ表示しています(再読み込みするたびにランダムに表示)
下のGIFの状況です。
○画像とその下の文字列はaタグ内に配置
○その画像が格納しているitemsテーブルはid,name,image,points,compe_id,created_at,updated_atのカラムが存在
【実現したいこと】
画像をクリックしたときに、itemsテーブルのpointsカラムの値に+1されるように実装したい
該当のソースコード
app/views/competitions/top.html.erb
Ruby
1 2<h1 id="heading">Click either you "like".</h1> 3 4<div id="pictures"> 5 <% @random_items.each do |item| %> 6 <div id="picture"> 7 <%= link_to "#" do %> 8<!-- public/item_images の中に画像を格納しておく。--> 9<!-- DBには画像のデータの名前を入れておく--> 10 <%= image_tag "/item_images/#{item.image}" ,width: "500px"%> 11 <div> 12 <%= item.name %> 13 </div> 14 <% end %> 15 </div> 16 <% end %> 17</div> 18
app/controllers/competitions_controller.rb
Ruby
1class CompetitionsController < ApplicationController 2 3 # GET / 4 # ランダムに画像を表示させる 5 def top 6 # ItemモデルのデータをRANDOMメソッドで並び替え、その中の2つを@random_itemsに入れて、テンプレートへ渡す 7 @random_items = Item.order("RANDOM()").limit(2) 8 end 9 10 def index 11 end 12 13 def show 14 end 15 16 def update 17 end 18end 19
config/routes.rb
Rails.application.routes.draw do # GET / top画面 root 'competitions#top' # GET /index 大会一覧画面へ遷移 get '/competitions', to: 'competitions#index' # GET /conpetitions/:id で大会詳細画面へ遷移 # PATCH PUT/competitions/:id でポイント+1 resources :competitions, only: [:show,:update] end
補足情報(FW/ツールのバージョンなど)
- ruby 2.7.0p0
- Rails 6.1.0
- sqlite
提示のコードではどういう動作になるんでしょうか
ブラウザ上で a タグをクリックした時に、サーバー側にその情報を送って、サーバー上のデータベースを更新する必要がある、というのはお分かりでしょうか? その際、ブラウザ側で画面遷移するなら普通のリンクですが、画面遷移しないなら JavaScript で処理することになります。
y_waiwai 様
>提示のコードではどういう動作になるんでしょうか
現在、aタグ内に画像を仕込んであり、aタグ内のsrcは"/"としているため、画像をクリックすると同じく、toppageに飛んできます。
hoshi-takanori 様
>ブラウザ上で a タグをクリックした時に、サーバー側にその情報を送って、サーバー上のデータベースを更新する必要がある、というのはお分かりでしょうか?
その際、ブラウザ側で画面遷移するなら普通のリンクですが、画面遷移しないなら JavaScript で処理することになります。
一応、aタグをクリックしたときにDBを更新する必要があることは、認識しています。
ただ、今まで、私が経験してきたものは、formを使ってPOSTリクエストで作成(更新)してきたものばかりでしたので、通常、GETリクエストを送るaタグでどのように実装していいかが疑問でした。
<a href=".../update_count?id=1234"> または <a href=".../update_count/1234"> (1234 は画像の ID) みたいにして、リクエストを受け取った側で id を受け取って処理することは可能です。ただ、GET だとキャッシュや先読みされる可能性がありますね。
hoshi-takanori 様
> <a href=".../update_count?id=1234"> または <a href=".../update_count/1234"> (1234 は画像の ID) みたいにして、
2点確認させてください。
・update_count?(update_count/)は、組み込み関数でしょうか?それとも、自分で定義するのでしょうか?
・GETリクエストにて、update_count?(/)1234のパラメーターを送信して、それをcontroller側で受け取り、contoller側で+1したものを保存する。という流れになるのでしょうか?
お忙しいところお手数ですが、ご教授いただければ幸いです。
・update_count は自分で定義してください。Rails 知りませんが、/update_count/1234 なら get '/update_count/:id' とか書くのでは。
・はい。(HTML の仕組み上、<form method="GET" action="submit.html"> に送信すると、.../submit.html?name=xxx みたいに入力内容が追加された URL に飛びますが、form を使わずに <a href=".../submit.html?name=xxx"> とすれば同じ URL に飛ぶので、サーバーからは違いが見えません。)
詳細に教えていただきありがとうございます。
早速やってみたいと思います。ありがとうございました。
回答2件
あなたの回答
tips
プレビュー