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

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

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

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

Q&A

解決済

3回答

1571閲覧

Template Error undefined method を解決したい

jack20xx

総合スコア45

Ruby on Rails

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

0グッド

0クリップ

投稿2022/11/01 10:37

前提

Ruby on Railsで映画のレビューサイトを作っています。
投稿したコメントに映画のタイトルを表示する機能を追加したところ下記のエラーが出ました。
機能自体はうまく動作しているのでテストの書き方に問題があると考えています。
テストの元になっているのはRailsチュートリアルです。
undefined なので定義されていないことが原因だと思いますが、どこに、どのように記述すればよいでしょうか?
ご教授いただけると嬉しいです。

実現したいこと

  • 投稿したコメントに映画のタイトルを表示させる機能をテストでパスさせたい

エラーメッセージ

ERROR["test_profile_display", UsersProfileTest, 5.1500919768586755] test_profile_display#UsersProfileTest (5.15s) ActionView::Template::Error: ActionView::Template::Error: undefined method `title' for nil:NilClass app/views/comments/_comment.html.erb:5:in `_app_views_comments__comment_html_erb__857699480521752031_47037482885220' app/views/users/show.html.erb:19:in `_app_views_users_show_html_erb___3985789656075004903_47037471840320' test/integration/users_profile_test.rb:14:in `block in <class:UsersProfileTest>'

該当のソースコード

1. パーシャル _comment.html.erb
2. show.html.erb
3. users_profile_test.rb

1. パーシャル _comment.html.erb

<li id="comment-<%= comment.id %>"> <%= link_to gravatar_for(comment.user, size: 50), comment.user %> <span class="user"><%= link_to comment.user.name, comment.user %></span> <span class="content"><%= comment.content %></span> <span class="title"><%= link_to comment.movie.title, "/movies/#{comment.movie_id}" %></span> #該当箇所 <span class="timestamp"> Posted <%= time_ago_in_words(comment.updated_at) %> ago. <% if current_user?(comment.user) %> <%= link_to "edit", "/comments/#{comment.id}/edit?movie_id=#{comment.movie_id}" %> <%= link_to "delete", comment, method: :delete, data: { confirm: "You sure?" } %> <% end %> </span> </li>

2. show.html.erb

<% provide(:title, @user.name) %> <div class="row"> <aside class="col-md-4"> <section class="user_info"> <h1> <%= gravatar_for @user %> <%= @user.name %> </h1> </section> <section class="stats"> <%= render 'shared/stats' %> </section> </aside> <div class="col-md-8"> <%= render 'follow_form' if logged_in? %> <% if @user.comments.any? %> <h3>Comments (<%= @user.comments.count %>)</h3> <ol class="comments"> <%= render @comments %> #該当箇所 </ol> <%= will_paginate @comments %> <% end %> </div> </div>

3. users_profile_test.rb

equire 'test_helper' class UsersProfileTest < ActionDispatch::IntegrationTest include ApplicationHelper def setup @user = users(:michael) end test "profile display" do get login_path post login_path, params: { session: { email: @user.email, password: 'password' } } get user_path(@user) #該当箇所 assert_template 'users/show' assert_select 'title', full_title(@user.name) assert_select 'h1', text: @user.name assert_select 'h1>img.gravatar' assert_match @user.comments.count.to_s, response.body assert_select 'div.pagination' @user.comments.paginate(page: 1).each do |comment| assert_match comment.content, response.body end end end

コメント

初学者のため、至らない点がございましたら申し訳ありません。
他に必要なソースコードがありましたら、随時追加いたしますので、教えていただければと思います。
何卒よろしくお願いいたします。

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

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

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

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

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

guest

回答3

0

これは頻繁に発生するエラーであり、修正方法が必ず見つかると思います。 mapquest directions

投稿2023/10/10 01:17

emmausa

総合スコア8

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

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

0

まずは、テストで使用しているコードを確認して、どのようなメソッドや変数がundefinedエラーを引き起こしているかを特定する必要があります ovo game

投稿2023/04/21 08:49

編集2023/04/21 08:51
drewbinsky

総合スコア6

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

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

0

ベストアンサー

エラーメッセージにはこのように書いてあります

ruby

1ActionView::Template::Error: ActionView::Template::Error: undefined method `title' for nil:NilClass 2app/views/comments/_comment.html.erb:5

おっしゃる通りこちらがエラーの該当箇所になります。

ruby

1<%= link_to comment.movie.title, "/movies/#{comment.movie_id}" %>

より具体的にいうと comment.movie.title ここのtitleというメソッドを実行する際にエラーになっています。
エラー原因は、comment.movienilであるのに、titleメソッドを実行しようとしているためです。

なので解決策としては、comment.movieがnilにならないようにするか、nilのときにもエラーが起きないようにする方法があります。

[nilのときにもエラーが起きないようにする方法]
こちらについては、comment.movieがnilのときに、comment.movie.title を実行させないようにすることがいいと思われます。
例えば、以下のようにすると comment.movieが存在するときのみ実行されます。よって、comment.movieがnilのときにcomment.movie.titleが実行されることはなくなります。

ruby

1<% if comment.movie %> 2 <span class="title"><%= link_to comment.movie.title, "/movies/#{comment.movie_id}" %></span> 3<% end %>

投稿2022/11/02 01:52

hatsu

総合スコア1809

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

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

jack20xx

2022/11/02 02:01

hatsu様 詳しいご解説ありがとうございます。 大変分かりやすかったです。 ご教授いただいたとおりに実行したところパスしました。 ベストアンサーとさせていただきます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問