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

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

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

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails

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

JavaScript

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

Q&A

解決済

2回答

1407閲覧

railsを用いた評価システム作成の際、意図せず星が重複してしまいます。

n-s0120

総合スコア1

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails

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

JavaScript

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

0グッド

0クリップ

投稿2021/06/09 03:50

編集2021/06/11 10:28

前提・実現したいこと

プログラミング初心者です。
現在、ruby、ruby on railsを用いて、本の感想を投稿したり、その評価を投稿したりするシステムを作っております。
ユーザーからの投稿がなされると、その投稿結果が、indexに表示されるシステムにしたいと考えております。
今回の問題は、5段階評価で評価をつけて投稿をすると、index画面に遷移した際(ヘッダーのBooksを押したとき)、星が一瞬10個表示(画像1)され、5個に戻る(画像2)という挙動が見受けられました。

この、10個星が表示されてしまう挙動をなくしたいと考えております。
何か解決策はないでしょうか。

画像1
イメージ説明

画像2
イメージ説明

画像3(修正後)
イメージ説明

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

5段階評価で表示したいが、一瞬だけ、星が10個表示されてしまう。

エラーメッセージ:なし

該当のソースコード

Ruby

1 2【books/index.html.erb】 3 4<%= render 'searchform' %> 5<% if @book.errors.any? %> 6 <ul> 7 <% @book.errors.full_messages.each do |message| %> 8 <li><%= message %></li> 9 <% end %> 10 </ul> 11<% end %> 12 13<div class='container px-5 px-sm-0'> 14 <div class='row'> 15 <div class='col-md-3'> 16 <h2>User info</h2> 17 <%= render 'users/info', user: current_user %> 18 <h2 class="mt-3">New book</h2> 19 <%= render 'form', book: @book %> 20 </div> 21 <div class='col-md-8 offset-md-1'> 22 <h2>Books</h2> 23 <%= render 'index', books: @books, book: @book %> 24 </div> 25 </div> 26</div>

Ruby

1 2【books/_index.html.erb】 3<table class='table table-hover table-inverse'> 4 <thead> 5 <tr> 6 <th></th> 7 <th>Title</th> 8 <th>Opinion</th> 9 <th colspan="3"></th> 10 </tr> 11 </thead> 12 <tbody> 13 <% books.each do |book| %> 14 <%= render 'books/book', book: book %> 15 <% end %> 16 </tbody> 17</table>

Ruby

1 2【books_controller.erb】 3 4class BooksController < ApplicationController 5 6 def show 7 @book = Book.find(params[:id]) 8 @book_new = Book.new 9 @user = @book.user 10 @book_comment = BookComment.new 11 end 12 13 def index 14 @books = Book.all 15 @book = Book.new 16 end 17 18 def create 19 @book = Book.new(book_params) 20 @book.user_id = current_user.id 21 if @book.save 22 redirect_to book_path(@book), notice: "You have created book successfully." 23 else 24 @books = Book.all 25 render 'index' 26 end 27 end 28 29 def edit 30 @book = Book.find(params[:id]) 31 @user = @book.user 32 if @user == current_user 33 render :edit 34 else 35 redirect_to books_path 36 end 37 end 38 39 def update 40 @book = Book.find(params[:id]) 41 if @book.update(book_params) 42 redirect_to book_path(@book), notice: "You have updated book successfully." 43 else 44 render "edit" 45 end 46 end 47 48 def destroy 49 @book = Book.find(params[:id]) 50 @book.delete 51 redirect_to books_path 52 end 53 54 def search 55 @range = params[:range] 56 search = params[:search] 57 keyword = params[:keyword] 58 @books = User.search(search, keyword) 59 end 60 61 private 62 63 def book_params 64 params.require(:book).permit(:title, :body, :evaluation) 65 end 66 67end 68

Ruby

1【book.rb】 2class Book < ApplicationRecord 3 belongs_to :user 4 has_many :book_comments, dependent: :destroy 5 has_many :favorites, dependent: :destroy 6 7 def favorited_by?(user) 8 favorites.where(user_id: user.id).exists? 9 end 10 11 validates :title, presence: true 12 validates :body, presence: true, length: {maximum: 200} 13 validates :evaluation, numericality: { 14 less_than_or_equal_to: 5, 15 greater_than_or_equal_to: 1 16 } 17 18 def self.search(searches, keywords) 19 if searches == "perfect_match" 20 @book = Book.where("title LIKE? OR body LIKE?", "#{keywords}", "#{keywords}") 21 elsif searches == "forward_match" 22 @book = Book.where("title LIKE? OR body LIKE?", "#{keywords}%", "#{keywords}%") 23 elsif searches == "backward_match" 24 @book = Book.where("title LIKE? OR body LIKE?", "%#{keywords}", "%#{keywords}") 25 else 26 @book = Book.where("title LIKE? OR body LIKE?", "%#{keywords}%", "%#{keywords}%") 27 end 28 end 29end 30

Ruby

1 2【books/_book.html.erb】 3<tr> 4 <td> 5 <%= link_to user_path(book.user) do %> 6 <%= attachment_image_tag(book.user, :profile_image, :fill, 50, 50, fallback: "no-image-icon.jpg") %> 7 <% end %> 8 </td> 9 <td><%= link_to book.title, book_path(book), class: "book_#{book.id}" %></td> 10 <td><%= book.body %></td> 11 12 <td id="favorite-btn-<%= book.id %>"> 13 <%= render partial: "favorites/favorite-btn",locals: {book: book } %> 14 </td> 15 16 <td id="comments"> 17 コメント数:<%= book.book_comments.count %> 18 </td> 19 20 <td class="book-evaluation" data-score="<%= book.evaluation %>"></td> 21</tr> 22 23<script> 24$('.book-evaluation').raty({ 25 readOnly: true, 26 path: '/assets/' 27}); 28</script> 29

試したこと

classやidの変更などを行いましたが、上手く解決できませんでした。

補足情報(FW/ツールのバージョンなど)

必要な情報が足りていないかもしれませんので、必要な情報がございましたら、お教えください。

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

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

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

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

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

okuramasafumi

2021/06/09 12:30

該当のコントローラーとモデルのコードも共有をお願いします!
guest

回答2

0

自己解決

コードを書きのように修正をしたところ、解決いたしました。
恐らく、book-evaluationにIDがついておらず、識別ができていなかったことが原因だと思われます。
お時間をいただき、ありがとうございました。

ruby

1【_index.html.erb】 2<td> 3 <div id="book-evaluation_<%= book.id %>"></div> 4 <script> 5 $('#book-evaluation_<%= book.id %>').raty({ 6 size: 20, 7 starOff: '<%= asset_path('star-off.png') %>', 8 starOn : '<%= asset_path('star-on.png') %>', 9 starHalf: '<%= asset_path('star-half.png') %>', 10 half: true, 11 readOnly: true, 12 score: <%= book.evaluation %>, 13 }); 14 </script> 15</td>

投稿2021/06/12 15:18

n-s0120

総合スコア1

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

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

0

なるほど、Ratyというものがあるのですね、初めて知りました。

原因はRatyの書き方だと思います。data属性からJSで取ってくるのでその分のラグがある感じです。

まずはbooks.eachの部分をさらにパーシャル(_book.html.erb)に分割し、その各パーシャル内でRatyの初期化を記述すればいけるかなと思います。

【books/_index.html.erb】 <table class='table table-hover table-inverse'> <thead> <tr> <th></th> <th>Title</th> <th>Opinion</th> <th colspan="3"></th> </tr> </thead> <tbody> <% books.each do |book| %> render partial: 'book', locals: {book: book} <% end %> </tbody> </table>
【books/_book.html.erb】 <tr> <td> <%= link_to user_path(book.user) do %> <%= attachment_image_tag(book.user, :profile_image, :fill, 50, 50, fallback: "no-image-icon.jpg") %> <% end %> </td> <td><%= link_to book.title, book_path(book), class: "book_#{book.id}" %></td> <td><%= book.body %></td> <td id="favorite-btn-<%= book.id %>"> <%= render partial: "favorites/favorite-btn",locals: {book: book } %> </td> <td id="comments"> コメント数:<%= book.book_comments.count %> </td> <td class="book-evaluation" data-score="<%= book.evaluation %>"></td> </tr> <script> $('.book-evaluation').raty({ readOnly: true, score: <%= book.evaluation %>, path: '/assets/' }); </script>

投稿2021/06/09 15:47

編集2021/06/11 18:18
okuramasafumi

総合スコア117

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

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

n-s0120

2021/06/10 15:36 編集

ご回答ありがとうございます。 お教えいただいたコードを記載したのですが、同様の症状が起きてしまうようです・・・。 【その各パーシャル内でRatyの初期化を記述すれば】 とお教えいただきましたが、その点につき、私が理解できておらず、記述していただいた部分以外の手直しができていないことが原因かと思われます。 初学者故、こちらの不明点をお教えいただけますと幸いです。 何卒、よろしくお願いいたします。
okuramasafumi

2021/06/11 07:16

`.raty`内の`score`の行を消してみるとどうなるでしょうか?
n-s0120

2021/06/11 10:32

消してみたところ、星が増えてしまいました・・・。(画像3を追加しました) ただ、もしかしますと、教えていただいたコードですとエラーが出てしまうため、修正した箇所がございますので、そちらの影響を受けている可能性があります。 元の質問に修正を反映しましたが、こちらでも補足いたします。 ①_books.html.erb内で、locals {book :book} を記述すると_index.html.erbの「book」がnameErrorとなり、@bookではないか?と言われてしまう。 ②render 'book', locals: {book: book} を <%= %>で囲み、編集をし直しました。 ご教示いただけますと幸いです。
okuramasafumi

2021/06/11 18:21

すみません、回答を編集しました、`render partial: 'book', locals: {book: book}`が正しいです。 星が増えるのは、`numberMax: 5`の記述を`.raty`の中に追加することで直るかもしれません。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問