質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.32%
Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

1回答

1525閲覧

[Rails][raty.js]ブラウザで戻るボタンを押すと、raty.jsが再度呼び出されて、星がたくさん表示される

nozomitakenoko

総合スコア3

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

0クリップ

投稿2020/11/12 13:35

編集2020/11/12 13:41

前提・実現したいこと

環境 Rails 6.0.3.4

######railsを使って食べログのようなシェアハウスを探すサイトを作っています。

主なモデルの説明
House ・・・物件情報 (houses/index.html.erb は ransackでの検索結果一覧を表示しているページです。)
Comment・・・ 口コミ (口コミカラムはHouseとUserの中間カラム)
User ・・・ユーザー

######raty.jsを使って5段階表示の星型レビューを実装しました。
その際、以下記事を参考にしました。
【Rails】レビュー用の星★の評価を実装する(入力、保存、表示)

その後、口コミが投稿されていない物件がある時にエラーが出たので、if文で口コミが存在しない時は白い星を5個表示するようにコードを書きました。

<% if house.comments.present? %> <span id="star-rate-<%= house.id %>"></span> <%= house.comments.average(:star).round(1)%> <p>最新の口コミ<%= house.comments.count%>件</p> <script> $(document).on('turbolinks:load', function(){ $("#star-rate-<%= house.id %>").raty({ size : 36, starOff : '<%= asset_path('star-off.png') %>', starHalf : '<%= asset_path('star-half.png') %>', starOn : '<%= asset_path('star-on.png') %>', half : true, readOnly: true, score: <%= house.comments.present? ? house.comments.average(:star).round(1) :0 %>, }); }) </script> <% else %> <img src="/assets/star-off.png"> <img src="/assets/star-off.png"> <img src="/assets/star-off.png"> <img src="/assets/star-off.png"> <img src="/assets/star-off.png"> <%= 0.0%> <p>最新の口コミ<%= house.comments.count%>件</p> <% end %>

しかし
ブラウザで戻るボタンを押すと、再度raty.js が呼び出されてしまい、houses/index.html.erbに表示されている物件数×5個の白い星が表示されてしまいます。戻るボタンを押さなければ綺麗に星を表示することができます。
![イメージ説明]

戻るボタンを押した際に綺麗に5個だけ星が表示されるようにしたいです。

発生している問題・エラーメッセージ

サーバー上、ブラウザ共にエラー文は出ていません。

該当のソースコード

houses/index.html.erb

ruby

1<div class="house_list"> 2<% @houses.each do |house|%> 3 <%= link_to house, class:"card border-light mb-3 card-columns card-dec Editlink", style:"max-width: 80%; border-width:5px 0 0 0;" do %> 4 <div class="card-header"><%= house.name %> / <%= house.area.name%></div> 5 <div class="card-body"> 6 <div class="row"> 7 <%= image_tag house.house_image.url,class:"col-3" %> 8 <div class="col-9 "> 9 <p class="card-text">賃料 <%= house.house_rent %>円</p> 10 <p class="card-text">アクセス <%= house.station %>駅 / 徒歩<%= house.access %>分</p> 11 <% if house.comments.present? %> 12 <span id="star-rate-<%= house.id %>"></span> 13 <%= house.comments.average(:star).round(1)%> 14 <p>最新の口コミ<%= house.comments.count%>件</p> 15 <script> 16 $(document).on('turbolinks:load', function(){ 17 $("#star-rate-<%= house.id %>").raty({ 18 size : 36, 19 starOff : '<%= asset_path('star-off.png') %>', 20 starHalf : '<%= asset_path('star-half.png') %>', 21 starOn : '<%= asset_path('star-on.png') %>', 22 half : true, 23 readOnly: true, 24 score: <%= house.comments.present? ? house.comments.average(:star).round(1) :0 %>, 25 }); 26 }) 27 </script> 28 <% else %> 29 <img src="/assets/star-off.png"> 30 <img src="/assets/star-off.png"> 31 <img src="/assets/star-off.png"> 32 <img src="/assets/star-off.png"> 33 <img src="/assets/star-off.png"> 34 <%= 0.0%> 35 <p>最新の口コミ<%= house.comments.count%>件</p> 36 <% end %> 37 <p id="housecount-<%= house.id %>" > 38 <i class="fas fa-bookmark"></i> 39 <%= render 'clips_count',house: house %>件 40 </p> 41 </div> 42 </div> 43 </div> 44 <% end %> 45 <% end %> 46</div>

houses_controller

def index @q = House.ransack(params[:q]) @houses= @q.result(distinct: true) @areas=Area.all @comments=Comment.where(house_id: @house) end

試したこと

####1 tubolinksの導入
https://teratail.com/questionsn/246572
上記記事を参考に、tubolinksの記述をしましたが上手く行きませんでした。

####2 星を入れる前に中身を空にする操作を導入
```

<script> $('#"star-rate-<%= house.id %>"').remove(); $("#star-rate-<%= house.id %>").raty({ size : 36, starOff : '<%= asset_path('star-off.png') %>', starHalf : '<%= asset_path('star-half.png') %>', starOn : '<%= asset_path('star-on.png') %>', half : true, readOnly: true, score: <%= house.comments.present?house.comments.average(:star).round(1) :0 %>, }); </script>
### 補足情報(FW/ツールのバージョンなど) githubのリンクも載せておきます。(masterブランチを参照してください) [github](https://github.com/nakamitsu-nozomi/share_house_app/blob/master/app/views/houses/index.html.erb) 5日ほど考えておりますが解決できず、本当に困っております。ご回答頂けると幸いです。よろしくお願い致します。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

Turbolinksを使うのであれば、ビューにJavaScriptを書くべきではありません(ビューを読み込むたびに同じJavaScriptが何度も登録されていくことになります)。

投稿2020/11/12 13:45

maisumakun

総合スコア146505

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

nozomitakenoko

2020/11/12 23:18 編集

ご回答ありがとうございます。 ``` score: <%= house.comments.present?house.comments.average(:star).round(1) :0 %>, ``` の部分のhouseはeach文の引数を使っているために、houses/index.html.erbのeach文の中に、jsを書いたのですが、別でjsを作る場合は、 ``` score: <%= house.comments.present?house.comments.average(:star).round(1) :0 %>, ``` はどのように書くべきなのでしょうか。
maisumakun

2020/11/13 00:35

何かしらのエレメントにdata-xxxのような形でデータを埋め込んでおいて、それをJavaScriptから読み取る、という形が適当かと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.32%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問