前提・実現したいこと
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)
最後に
なかなか今回と同様の事象に対する情報が得ることができず、投稿させていただきました。
プログラミング初心者ですがアドバイスを頂けますと幸いです。
宜しくお願いいたします。
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。