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

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

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

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

Ruby on Rails 6

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

Q&A

解決済

2回答

2394閲覧

【Rails】コントローラのメソッドが2回繰り返し実行されてしまう

Unimaru

総合スコア4

Ruby

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

Ruby on Rails 6

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

0グッド

0クリップ

投稿2021/05/15 00:00

前提・実現したいこと

RailsでViewからlink_toを使い、コントローラのメソッドを呼び出す際、同じメソッド(unlearned)が2回繰り返し実行されてしまいます。
前提や詳細は以降に記載いたしますので、上記解消にむけたアドバイス等を頂けますと幸いです。

※「learned」メソッドも同様に呼び出す際、2回実行されますが、今回「unlearned
」に焦点を当てて以下まとめます。

■ 前提
・masOS : Catalina 10.15.4
・ruby : 2.6.5
・rails : 6.0.3.6

■ アプリの概要

・ユーザはTankと呼ばれる、Word(単語)を登録するためのカテゴライズされた箱のようなものを作成できる。例)「英単語」Tankなど
・ユーザはTankの中にWord(単語)を登録していける。
・Wordはユーザ自身の正答率に応じて、同じTankの中でも擬似的に「未習得Tank」、「習得済Tank」として振り分けられる。
※正答率70%を境界として、DBから正答率で条件検索し、画面表示を振り分けるだけ
・今回、発生した問題はTankのindexページから、「未習得Tank」ページに遷移する際に呼び出す「unlearned
」メソッドが連続して2回実行されてしまうことです。。

■ View (/app/views/words/index.html.erb)

<div class="tank_container2"> <p class="p3">WordTank:<%= @tank.tank_name %></p> <div class="tank_top"> <%= link_to "Wordを登録する", new_tank_word_path(@tank.id), class: "btn btn--orange btn--shadow" %> <%= link_to "戻る", word_search_tank_path(current_user.id), class: "btn btn--blue btn--shadow" %> </div> <p class="p7">Wordを登録するとまずは「未習得Tank」に蓄積される</p> <p class="p7">Wordの意味を覚えて、「習得済Tank」に移動させる</p> <div class="tank_title"> <div class="left_tank_title"> <p class="p3">習得済Tank</p> </div> <div class="right_tank_title"> <p class="p3">未習得Tank</p> </div> </div> <div class="tank"> <div >     <%= link_to image_tag("/images/tank_img.jpg", class: 'left_tank' ) , learned_tank_words_path(@tank.id) %> </div> <div> <%= link_to image_tag("/images/tank_img_2.jpg", class: 'right_tank' ) , unlearned_tank_words_path(@tank.id) %> </div> </div> <div class="tank_comment"> <div class="memory_tank_comment"> <p class="p4">自分の正答率が70%以上のWordが蓄積</p> </div> <div class="question_tank_comment"> <p class="p4">自分の正答率が70%未満のWordが蓄積</p> </div> </div> </div> <footer> <div class="footer_left"> <div class="footer_left_main"> <a href="/"><p class="p2">MemoryTank</p></a> </div> <div class="fotter_left_sub"> <p class="p2">フッター</p> </div> </div> </footer>

■ Controller (/app/controllers/words_controller.rb)内のメソッド

def unlearned @words = Word.unlearned(params[:tank_id]) @tank = Tank.find_by(id: params[:tank_id]) puts "メソッドが" puts "2回" puts "繰り返される" end

■ Model (/app/models/word.rb)

class Word < ApplicationRecord belongs_to :tank belongs_to :user def self.unlearned(id) Word.where("tank_id = ?",id).where("correct_rate < ?",70) end end

■ルーティング (/config/routes.rb)

Rails.application.routes.draw do devise_for :users resources :tanks , :except => :show do resources :words do collection do get 'unlearned' end end end end ※ rails routesの結果⇩ unlearned_tank_words GET /tanks/:tank_id/words/unlearned(.:format) words#unlearned

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

上記の前提のもと、Viewから以下のリンクを押下してみます。

<%= link_to image_tag("/images/tank_img_2.jpg", class: 'right_tank' ) , unlearned_tank_words_path(@tank.id) %>

すると、ターミナルを確認してみると、以下のようにメソッド内でputsで記載された「メソッドが2回繰り返される」の文言が繰り返し表示されていることが分かります。

=> Booting Puma => Rails 6.0.3.6 application starting in development => Run `rails server --help` for more startup options Puma starting in single mode... * Version 4.3.7 (ruby 2.6.5-p114), codename: Mysterious Traveller * Min threads: 5, max threads: 5 * Environment: development * Listening on tcp://127.0.0.1:3000 * Listening on tcp://[::1]:3000 Use Ctrl-C to stop Started GET "/tanks/12/words/unlearned" for ::1 at 2021-05-15 08:53:47 +0900 (0.3ms) SET NAMES utf8, @@SESSION.sql_mode = CONCAT(CONCAT(@@sql_mode, ',STRICT_ALL_TABLES'), ',NO_AUTO_VALUE_ON_ZERO'), @@SESSION.sql_auto_is_null = 0, @@SESSION.wait_timeout = 2147483 (0.3ms) SELECT `schema_migrations`.`version` FROM `schema_migrations` ORDER BY `schema_migrations`.`version` ASC Processing by WordsController#unlearned as HTML Parameters: {"tank_id"=>"12"} Tank Load (0.3ms) SELECT `tanks`.* FROM `tanks` WHERE `tanks`.`id` = 12 LIMIT 1 ↳ app/controllers/words_controller.rb:60:in `unlearned' メソッドが 2回 繰り返される Rendering words/unlearned.html.erb within layouts/application Word Load (0.3ms) SELECT `words`.* FROM `words` WHERE (tank_id = '12') AND (correct_rate < 70) ↳ app/views/words/unlearned.html.erb:17 Rendered words/unlearned.html.erb within layouts/application (Duration: 20.7ms | Allocations: 9980) [Webpacker] Everything's up-to-date. Nothing to do User Load (0.3ms) SELECT `users`.* FROM `users` WHERE `users`.`id` = 7 ORDER BY `users`.`id` ASC LIMIT 1 ↳ app/views/layouts/application.html.erb:30 Completed 200 OK in 108ms (Views: 68.5ms | ActiveRecord: 9.7ms | Allocations: 36968) Started GET "/tanks/12/words/unlearned" for ::1 at 2021-05-15 08:53:47 +0900 Processing by WordsController#unlearned as HTML Parameters: {"tank_id"=>"12"} Tank Load (0.5ms) SELECT `tanks`.* FROM `tanks` WHERE `tanks`.`id` = 12 LIMIT 1 ↳ app/controllers/words_controller.rb:60:in `unlearned' メソッドが 2回 繰り返される Rendering words/unlearned.html.erb within layouts/application Word Load (0.3ms) SELECT `words`.* FROM `words` WHERE (tank_id = '12') AND (correct_rate < 70) ↳ app/views/words/unlearned.html.erb:17 Rendered words/unlearned.html.erb within layouts/application (Duration: 2.4ms | Allocations: 2340) [Webpacker] Everything's up-to-date. Nothing to do User Load (0.4ms) SELECT `users`.* FROM `users` WHERE `users`.`id` = 7 ORDER BY `users`.`id` ASC LIMIT 1 ↳ app/views/layouts/application.html.erb:30 Completed 200 OK in 12ms (Views: 9.3ms | ActiveRecord: 1.1ms | Allocations: 8191)

最後に

なかなか今回と同様の事象に対する情報が得ることができず、投稿させていただきました。
プログラミング初心者ですがアドバイスを頂けますと幸いです。
宜しくお願いいたします。

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

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

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

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

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

guest

回答2

0

自己解決

「application.html.erb」に記載のある「<%= javascript_pack_tag 'application', 'data-turbolinks-track': 'reload' %> 」をコメントアウトしたら、問題解消しました!
( turbolinksについて、理解が浅いので、調べて学習してみます。)

投稿2021/05/15 03:03

Unimaru

総合スコア4

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

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

0

ログを見る限り、/tanks/12/words/unlearnedへのアクセスそのものが2回行われていますので、1アクセスについて1回呼び出されるコントローラーは、当然2回実行されます。

投稿2021/05/15 00:03

maisumakun

総合スコア146018

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

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

maisumakun

2021/05/15 00:05

そもそも論として、getは冪等であるべきなので、2回呼び出されても問題なく動くように書いておくのが適切です(キャッシュや先読みなど、複数回アクセスして使うこともありえます)。
Unimaru

2021/05/15 00:23

ご回答ありがとうございます!説明が不足しており、すみません。 Viewからは「unlearned」を呼び出すリンクを1回しか押していないにも関わらず、メソッドが2周してしまう状況です。。 意図せず、1回のリンク押下でアクセスが2回実行されるような記述?構成?となってしまっているのかも知れません。。
maisumakun

2021/05/15 00:25

2回呼ばれることに不利益がないなら、とりあえず放置でも構わないかと思います。
Unimaru

2021/05/15 00:52

「application.html.erb」に記載のある「<%= javascript_pack_tag 'application', 'data-turbolinks-track': 'reload' %> 」をコメントアウトしたら、問題解消しました!お騒がせしました。。 ( turbolinksについて、理解が浅いので、調べて学習してみます。)
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問