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

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

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

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

Q&A

解決済

1回答

1120閲覧

Ruby on Rails Tutorial 13章 13.3.3 フィードの原型 @feed_itemsインスタンス変数に関する疑問

natecosan

総合スコア23

Ruby on Rails 5

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

0グッド

0クリップ

投稿2019/04/13 04:10

Rails Tutorialの2周目を進めています。
13.3.3 フィードの原型 で、フィードの実装は問題なく済んでいるのですが、チュートリアルの説明として理解できない部分があるので質問させてください。

現時点では、新しいマイクロポストの作成は図 13.15で示したように期待どおりに動作しています。ただしささいなことではありますが、マイクロポストの投稿が失敗すると、 Homeページは@feed_itemsインスタンス変数を期待しているため、現状では壊れてしまいます。最も簡単な解決方法は、リスト 13.50のように空の配列を渡しておくことです。残念ですが、この場合はページ分割されたフィードを返してもうまく動きません。動かない理由を確認したい方は、実際に実装してページネーションのリンクをクリックしてみてください。

この解説の、「マイクロポストの投稿が失敗すると@feed_itemsインスタンス変数を期待しているため、現状では壊れてしまいます」という部分が、

<% if @feed_items.any? %> ->undefined method `any?' for nil:NilClass

このようなエラーとなるのは確認しているのですが、なぜエラーになるのかがわかりません。
@feed_itemsには既に「app/controllers/static_pages_controller.rb」の
@feed_items = current_user.feed.paginate(page:params[:page])
でログインしているユーザーのマイクロポストが入っているので、nilではないのでは・・・?と思ってしまいます。

どうぞよろしくお願いします。
###ソースコード
app/models/user.rb

class User < ApplicationRecord . . . # 試作feedの定義 # 完全な実装は次章の「ユーザーをフォローする」を参照 def feed Micropost.where("user_id = ?", id) end private . . . end

app/controllers/static_pages_controller.rb

class StaticPagesController < ApplicationController def home if logged_in? @micropost = current_user.microposts.build @feed_items = current_user.feed.paginate(page: params[:page]) end end def help end def about end def contact end end

app/views/shared/_feed.html.erb

<% if @feed_items.any? %> <ol class="microposts"> <%= render @feed_items %> </ol> <%= will_paginate @feed_items %> <% end %>

app/views/static_pages/home.html.erb

<% if logged_in? %> <div class="row"> <aside class="col-md-4"> <section class="user_info"> <%= render 'shared/user_info' %> </section> <section class="micropost_form"> <%= render 'shared/micropost_form' %> </section> </aside> <div class="col-md-8"> <h3>Micropost Feed</h3> <%= render 'shared/feed' %> </div> </div> <% else %> . . . <% end %>

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

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

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

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

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

guest

回答1

0

ベストアンサー

投稿時に実行されるのは MicropostsController の create メソッドであり、そこでは @feed_itemsインスタンス変数を設定していない、という話だと思います。少し先で @feed_items = [] を追加する回避策が紹介されています。

投稿2019/04/19 10:46

編集2019/04/19 12:29
iwamot

総合スコア1154

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

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

natecosan

2019/04/19 12:12

回答ありがとうございます!しかし途中で文章切れてしまっているので、お手数ですが続きを教えて下さい...!!笑
iwamot

2019/04/19 12:17

失礼しました。少し先で MicropostsController の create メソッドに @feed_items = [] を追加しているのはそのためでしょう、と言いたかったのでした。
iwamot

2019/04/19 12:29

回答を編集しました。
natecosan

2019/04/21 08:22

なるほど、理解できました!!ご丁寧にありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問