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

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

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

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

Q&A

解決済

Template Error undefined method を解決したい

jack20xx
jack20xx

総合スコア45

Ruby on Rails

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

1回答

0グッド

0クリップ

223閲覧

投稿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

コメント

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

以下のような質問にはグッドを送りましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

グッドが多くついた質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

下記のような質問は推奨されていません。

  • 間違っている
  • 質問になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

適切な質問に修正を依頼しましょう。

回答1

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

総合スコア1756

良いと思った回答にはグッドを送りましょう。
グッドが多くついた回答ほどページの上位に表示されるので、他の人が素晴らしい回答を見つけやすくなります。

下記のような回答は推奨されていません。

  • 間違っている回答
  • 質問の回答になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

このような回答には修正を依頼しましょう。

回答へのコメント

jack20xx

2022/11/02 02:01

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

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

ただいまの回答率
86.02%

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

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

質問する

関連した質問

同じタグがついた質問を見る

Ruby on Rails

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