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

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

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

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

Ruby on Rails

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

Q&A

3回答

4449閲覧

Ruby on Rails : undefined method `user' for #<User:0x007fa1367ddac8>

退会済みユーザー

退会済みユーザー

総合スコア0

Ruby

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

Ruby on Rails

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

0グッド

0クリップ

投稿2017/07/26 03:52

編集2022/01/12 10:55

イメージ説明

###やりたいこと

ユーザーがlikeした、questionを全て取り出し、表示したいのですが、うまく行きません。

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

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

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

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

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

guest

回答3

0

すいません画像とスニペットを貼りたいので再度解答させてください。

まず、頂いたlike.html.erbをみました。
原因としてはエラーが行っているようにend-of-inputのエラーです。

おそらく最後の方に<% end %>が2つありますよね?
これは様々な修正を行っている途中で出来たものだと思います。

なのでその<% end %>を一つ削除して下さい。
また、その下にある</div>も必要ない気がするので削除してくださいー!

そうしたら文法エラーが無くなると思います。

また、これはこれから気をつけたらいいなぁと思うことなのですが、
コード(htmlもcssもjsもrubyもrailsも他にも...)を書く上でインデントはすごく注意して下さい。

何かの中になにかがあるならそれは一段下げて表示してください。
例えば以下のような構造だと、タグの階層構造でどこのif文がどのendに対応しているかが見やすいです。

html

1<div> 2 <div> 3 <% if @user.image %> 4 <img src="<%= @user.image %>" width="100%"> 5 <% if @user.introduction %> 6 <p><%= @user.introduction %></p> 7 <% else %> 8 <p>まだ自己紹介は未設定だね!</p> 9 <% end %> 10 <% else %> 11 <p>プロフィール画像は未設定です</p> 12 <% end %> 13 </div> 14</div>

しかし、階層構造がバラバラだとどれがどのif文に対応しているかわかりません。

html

1<div> 2 <div> 3 <% if @user.image %> 4 <img src="<%= @user.image %>" width="100%"> 5 <% if @user.introduction %> 6 <p><%= @user.introduction %></p> 7 <% else %> 8 <p>まだ自己紹介は未設定だね!</p> 9 <% end %> 10 <% else %> 11 <p>プロフィール画像は未設定です</p> 12 <% end %> 13 </div> 14</div>

もちろん階層構造が原因ではありませんが、<% end %>が2つ不適切な部分にあるという階層構造化してhtmlを書いていれば比較的防ぎやすいエラーが起きてしまったので非常にもったいないです!

もし可能であればインデントを付けて綺麗なhtmlにしてみてください!
そうすることで必要ないミスも減りますし、そもそもエラーが起きても発見するまでの時間は早くなりますよ!

ということで、endのミスを直してみてくださいーー!
これで全て治ればいいのですが、、、、(笑)

最後に下に修正前と修正後のコードを張っておきますね!

修正後

<%= render "partial/navbar" %> <div class="user-show"> <div class="container"> <div class="row"> <div class="col-lg-3 col-md-4"> <div class="user-profile row-space-4 text-center"> <% if current_user.image %> <img src="<%= "/user_images/#{@user.image}" %>" class="profile-full img-circle"> <% else %> <p><%= link_to "プロフィール画像を追加する", edit_user_path(current_user), class:"profile-full img-circle" %></p> <% end %> </div> </div> <div class="col-lg-9 col-md-8 col-sm-12"> <div class="user-title"> <% if current_user.name %> <h1><%= @user.name%></h1> <% else %> <p><%= link_to "ユーザー名を追加して下さい", edit_user_path(current_user) %></p> <% end %> <% if current_user.id == @user.id %> <%= link_to "プロフィール編集", edit_user_path(current_user), class: "btn btn-default btn-full" %> <%= link_to "ログアウト", destroy_user_session_path, method: :delete, class: "btn btn-default btn-full" %> <% end %> </div> <div class="user-description"> 自己紹介: <% if current_user.description %> <%= @user.description %> <% else %> 自己紹介文が空白です。<%= link_to "自己紹介を書く", edit_user_path(current_user) %> <% end %> </div> </div> </div> </div> <ul class="user-tabs"> <li><%= link_to("質問", "/users/#{@user.id}") %></li> <li class="active"><%= link_to("お気に入り", "/users/#{@user.id}/likes") %></li> </ul> <br> <hr> <% @likes.each do |like| %> <% question = User.find_by(id: like.question_id) continue if question.nil? %> <div class="card"> <div class="card-block"> <h4 class="card-title"> <img src="<%= "/user_images/#{question.user.image}" %>" class="img-circle profile-1"> </h4> <h6 class="card-subtitle mb-2 text-muted"> <%= link_to(question.user.name, "/users/#{question.user.id}") %> </h6> <hr> <p class="card-text"> <%= link_to(question.content, "/questions/#{question.id}") %> </p> <p class="card-link"> <%= question.created_at.strftime('%Y/%m/%d %H:%M') %> </p> </div> </div> <% end %> <% end %> </div> </div>

修正前

<%= render "partial/navbar" %> <div class="user-show"> <div class="container"> <div class="row"> <div class="col-lg-3 col-md-4"> <div class="user-profile row-space-4 text-center"> <% if current_user.image %> <img src='<%= "/user_images/#{@user.image}" %>' class="profile-full img-circle"> <% else %> <p><%= link_to "プロフィール画像を追加する", edit_user_path(current_user), class:"profile-full img-circle" %></p> <% end %> </div> </div> <div class="col-lg-9 col-md-8 col-sm-12"> <div class="user-title"> <% if current_user.name %> <h1><%= @user.name%></h1> <% else %> <p><%= link_to "ユーザー名を追加して下さい", edit_user_path(current_user) %></p> <% end %> <% if current_user.id == @user.id %> <%= link_to "プロフィール編集", edit_user_path(current_user), class: "btn btn-default btn-full" %> <%= link_to "ログアウト", destroy_user_session_path, method: :delete, class: "btn btn-default btn-full" %> <% end %> </div> <div class="user-description"> 自己紹介: <% if current_user.description %> <%= @user.description %> <% else %> 自己紹介文が空白です。<%= link_to "自己紹介を書く", edit_user_path(current_user) %> <% end %> </div> </div> </div> </div> <ul class="user-tabs"> <li><%= link_to("質問", "/users/#{@user.id}") %></li> <li class="active"><%= link_to("お気に入り", "/users/#{@user.id}/likes") %></li> </ul> <br> <hr> <% @likes.each do |like| %> <% question = User.find_by(id: like.question_id) continue if question.nil? %> <div class="card"> <div class="card-block"> <h4 class="card-title"> <img src="<%= "/user_images/#{question.user.image}" %>" class="img-circle profile-1"> </h4> <h6 class="card-subtitle mb-2 text-muted"> <%= link_to(question.user.name, "/users/#{question.user.id}") %> </h6> <hr> <p class="card-text"> <%= link_to(question.content, "/questions/#{question.id}") %> </p> <p class="card-link"> <%= question.created_at.strftime('%Y/%m/%d %H:%M') %> </p> </div> </div> <% end %> <% end %> </div> </div>

投稿2017/07/26 05:46

MasakazuFukami

総合スコア1869

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

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

退会済みユーザー

退会済みユーザー

2017/07/26 06:04 編集

細かく指摘していただきありがとうございます。インデントの方、今後気をつけて、書きます。 そして、<% end %>と</div>を消したのですが、エラーが消えない状況です。undefined method `user' for #<User:0x007fa13de26540>と、エラーが出ます。 <div class="card-block">   <h4 class="card-title">     以下がエラーです。    <img src="<%= "/user_images/#{question.user.image}" %>" class="img-circle profile-1">   </h4>          :
MasakazuFukami

2017/07/26 06:24

<% question = Question.find_by(id: like.question_id) continue if question.nil? %> にするといかがでしょうか?
退会済みユーザー

退会済みユーザー

2017/07/26 06:57

undefined local variable or method `continue' for #<#<Class:0x007fa13d287928>:0x007fa13f266528>で、continue if question.nil?にエラーが出ます!
MasakazuFukami

2017/07/26 07:02 編集

<% @likes.each do |like| %> <% question = User.find_by(id: like.question_id) continue if question.nil? %> <div class="card"> ... </div> <% end %> を <% @likes.each do |like| %> <% question = User.find_by(id: like.question_id) %> <% unless if question.nil? %> <div class="card"> ... </div> <% end %> <% end %> にしてみてください! こちらだとインデントが崩れるようですスイマセン
退会済みユーザー

退会済みユーザー

2017/07/26 07:15

何度も申し訳ございません。 undefined method `user' for nil:NilClassとエラーが表示されます! 何か、根本的にダメなところが他にあるのでしょうか?
MasakazuFukami

2017/07/26 07:18

あ、すいません 僕が今の間違ってました(´;ω;`) User.find_byは僕が間違っても絶対書かないでください!(笑) Question.bind_byです!
guest

0

エラーの発生箇所

どの部分がエラーになっているのでしょうか?

エラー画面の赤くなっている行がエラーが発生している箇所です。

また、エラーメッセージにはundefined method user' for ...`と出ていますが、
これは userメソッドが定義されていませんよ という意味ですので、コード中でuserメソッドを呼び出している箇所がどこかを考えてみましょう。

ここでは、question.user.imageというコードがあり、questionからuserメソッドを読んでいることが分かるので、この部分がエラーになっているということがわかります。

修正方法

さて、questionオブジェクトにはuserメソッドが定義されていないことが分かったかと思います。
questionオブジェクトはquestion = User.find_by(id: like.question_id)という処理でセットされていますね?

find_byメソッドは対象のデータが存在しない場合にnilを返します。
今回のコードではquestion(質問?)を取得したいはずなのにUserテーブルのデータを検索していることが問題なのかと思います。

おそらく、QuestionというModelクラスが存在していると思うので、該当箇所を下記のように修正すれば動作させることが出来るのではないでしょうか?

question = Question.find_by(id: like.question_id)

投稿2017/07/26 04:08

k-motoyan

総合スコア78

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

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

退会済みユーザー

退会済みユーザー

2017/07/26 04:35

ご回答ありがとうございます!試して見たところ、同じエラーが発生します!
k-motoyan

2017/07/26 04:41 編集

失礼しました。 UserがQuestionをしていないケースを考慮しないといけませんので、 ``` question = Question.find_by(id: like.question_id) continue if question.nil? ``` のようにしないといけませんね。
guest

0

コードがすべてわかるわけではないので推測ですが、

question = User.find_by(id: like.question_id

なのでquestionはUserクラスのインスタンスです。
なのでuserインスタンス.user.imageではなくてuserインスタンス.imageではないでしょうか?

つまり

<img src="<%= "/user_images/#{question.user.image}" %>" class="img-circle profile-1"> ↓ <img src="<%= "/user_images/#{question.image}" %>" class="img-circle profile-1">

と言った感じです!

ただ、belongs_toなどで他のテーブルと関連付けている可能性もあるので一概には言えませんが。。。。

投稿2017/07/26 03:59

MasakazuFukami

総合スコア1869

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

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

退会済みユーザー

退会済みユーザー

2017/07/26 04:07

ご回答ありがとうございます! おっしゃっていったことを試してみたのですが、エラーになります! 大変申し訳ないのですが、モデルを追記しましたので、もう一度確かめていただけないででしょうか?
MasakazuFukami

2017/07/26 04:58

すいません下の方の回答も一緒に行いますが確かに、like.question_idから推定するにQuestion.find_by(id: like.question_id)で問題ないと思います。 また、エラーは同じと仰ってますが、Questionクラスのインスタンスを作成しているので正確にはエラー文言が変わっているはずです。 Ruby on Rails : undefined method `user' for #<User:0x007fa1367ddac8> 少なくともこちらと同じことはないかと思うのでエラー文言をお願いします!
退会済みユーザー

退会済みユーザー

2017/07/26 05:04

失礼いたしました。undefined method `user' for nil:NilClass というエラー内容でした。
MasakazuFukami

2017/07/26 05:07

おぉなるほど。 ちなみに現在のエラーとしてはk-motoyanさんがおっしゃってるように該当のquestionレコードが存在しないようなエラーとなっております。 この場合2つほどすることがあります。 ①今参照しようとしているquestionはDBにあるのかどうか ②なかったとき(nilが返ってきた時)は今を飛ばして次にいく。 という感じです。 なのでk-motoyanさんが書いてらっしゃるように ``` question = Question.find_by(id: like.question_id) continue if question.nil? ``` という風に変更した場合はどうでしょうか?
退会済みユーザー

退会済みユーザー

2017/07/26 05:09 編集

<% continue if question.nil? %> : <% end %> を追加しましたが、エラーで、/Users/admin/Desktop/test_app/app/views/users/likes.html.erb:87: syntax error, unexpected keyword_ensure, expecting end-of-input となります!
MasakazuFukami

2017/07/26 05:11

エラー内容をできれば読んでいただきたいのですが、 /Users/admin/Desktop/test_app/app/views/users/likes.html.erb:87: syntax error, unexpected keyword_ensure, expecting end-of-input は87行目にシンタックスエラー(文法エラー)があるということです。 87行目はどの部分でしょうか? また、以下のように書いたらどうなりますでしょうか? <% question = User.find_by(id: like.question_id) continue if question.nil? %>
退会済みユーザー

退会済みユーザー

2017/07/26 05:17

それが、likes.html.erb:87の87行目がありません。 新たに提示していただいた方法を試しても、エラーが出ます! /Users/admin/Desktop/test_app/app/views/users/likes.html.erb:89: syntax error, unexpected keyword_ensure, expecting end-of-input また、今回も89行目は存在しません!
MasakazuFukami

2017/07/26 05:19

すいませんここにでも、追記でも良いので/Users/admin/Desktop/test_app/app/views/users/likes.html.erbを貼っていただくことは可能でしょうか?
退会済みユーザー

退会済みユーザー

2017/07/26 05:26 編集

お手数おかけして申し訳ございません。 /Users/admin/Desktop/test_app/app/views/users/likes.html.erbは、質問内容のlikes.html.erbに追加いたしました。 よろしくお願いします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問