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

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

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

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

Ruby

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

Ruby on Rails

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

Q&A

解決済

2回答

359閲覧

存在確認&存在するデータだけ抜粋して表示する方法を教えてください

1750xkcm

総合スコア17

Ruby on Rails 5

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

Ruby

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

Ruby on Rails

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

0グッド

0クリップ

投稿2018/05/27 04:47

undefined method `image_name' for nil:NilClass

下記のフォロー機能を実装中に上記のエラーが表示されました。

def follows @user = User.find_by(id: params[:id]) @follows = Follow.where(user_id: @user.id) end
<ul> <% @follows.each do |follow| %> <% user = User.find_by(id: follow.follow_user_id) %> <li> <%= link_to image_tag("/user_image/#{user.image_name}","/users/#{user.id}") %> <%= link_to(user.name,"/users/#{user.id}") %> </li> <% end %> </ul>

■エラー後に試したこと

#ユーザーがフォローしているユーザーのIDを取得 <%= follow.follow_user_id %> => 7 14 24 26 56
#コンソールでIDのデータが存在するかをひとつずつ検索 #ユーザーIDの存在しないデータが数件みつかる rails console user = User.find_by(id:14) => nil

エラー原因はフォロー済みのユーザーが存在しない(退会している)からということでしょうか・・・?
またこのような場合、存在するデータだけ抜粋して表示するという方法はあるでしょうか?

存在確認用のメソッド exists?を使えばいけるかなと試行錯誤したのですがうまくいかず。
解決方法がお分かりになる方いましたら、ご助言いただけると幸いです。

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

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

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

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

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

guest

回答2

0

自己解決

何とか自己解決できました。
もっとスマートな書き方があるのかも知れませんが・・・。

解決方法は下記の通りです。

@user.empty?として@userの配列が空かをまず調べます。
そして返り値がtrueだった場合にフォロー自体を取り消すという処理を追加しました。

こうすることで、退会したユーザーのフォローのみ取り消され、
退会していないフォローユーザーのみeach文で繰り返し表示されるようになりました。

結果、エラーを解消することができました。

<ul>  <% @follows.each do |follow| %>   <% @user = User.find_by(id: follow.follow_user_id) %>    <% if @user.empty? == true %>    <% follow.destroy %>    <% end %>   <% @user.each do |user| %>   <li>    <%= link_to image_tag("/user_image/#{user.image_name}","/users/#{user.id}") %>    <%= link_to(user.name,"/users/#{user.id}") %>   </li>  <% end %> </ul>

投稿2018/05/27 13:49

編集2018/05/27 13:52
1750xkcm

総合スコア17

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

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

mkgrei

2018/05/27 14:05

if @user.empty? == true は if @user.empty? の方が一般的かもしれません。
1750xkcm

2018/05/28 05:18

!…確かにその通りですね。早速修正しました。 コメントいただきありがとうございます!
guest

0

スクリプト言語の強みとして、例外処理を行うことで、とりあえずやってみて、ダメだったら別に考えるようにコードを書くことができます。

rubyの場合、begin~rescueを使うことができます。

https://qiita.com/ktarow/items/9d8f3217bb148f2e51d2


今の場合
if user.nil?
でチェックする方が簡潔そうですが。

投稿2018/05/27 08:41

mkgrei

総合スコア8560

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

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

mkgrei

2018/05/27 08:42

その前に@userでは…
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問