🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Ruby on Rails

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

Q&A

解決済

1回答

844閲覧

rails tutorial 13章 'nil' is not an ActiveModel-compatible object エラーを解決したい

ketyan

総合スコア22

Ruby on Rails

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

0グッド

0クリップ

投稿2019/10/27 13:11

###現状
現在rails tutorial13章マイクロポストの描画を勉強中です。

ユーザーのmicropostを一覧で表示させようとしたところ、タイトルの
'nil' is not an ActiveModel-compatible object. It must implement :to_partial_path.
というエラーがサーバーに表示されました。

###エラーコード
エラーはapp/views/users/show.html.erbファイルの15行目、
<%= render @microposts %>の行で起きているようでした。

<% provide(:title, @user.name) %> <div class="row"> <aside class="col-md-4"> <section class="user_info"> <h1> <%= gravatar_for @user %> <%= @user.name %> </h1> </section> </aside> <div class="col-md-8"> <% if @user.microposts.any? %> <h3>Microposts (<%= @user.microposts.count %>)</h3> <ol class="microposts"> <%= render @microposts %> </ol> <%= will_paginate @microposts %> <% end %> </div> </div>

@micropostはusers_controller内のshowアクションで定義しています。

def show @user = User.find(params[:id]) @microposts = @user.microposts.paginate(page: params[:page]) end

###試したこと
ネットで似た状況の質問を見ていると、@micropostsに値が渡されていないことが
原因だった場合が多く、また部分テンプレートへのパスを直接指定するために
show.html.erbをunlessを使い以下のように書き換えました。

<% provide(:title, @user.name) %> ~略~ <ol class="microposts"> <% unless @microposts.blank? %> <%= render partial: "microposts/micropost", locals: { microposts: micropost.content }%> <%end%> </ol> <% unless @microposts.blank? %> <%= will_paginate @microposts %> <%end%> <% end %> </div> </div>

するとイメージ説明

このようにユーザー名、ユーザーのマイクロポスト数は表示されており、変数に値自体は入っているように思えます。

サーバーのログを載せておきます。

app/views/users/show.html.erb:15:in `_app_views_users_show_html_erb__2336219684752338369_70290005700780' Started GET "/users/1" for 106.172.115.46 at 2019-10-27 12:51:29 +0000 Cannot render console from 106.172.115.46! Allowed networks: 127.0.0.1, 127.0.0.0/127.255.255.255, ::1 Processing by UsersController#show as HTML Parameters: {"id"=>"1"} User Load (0.2ms) SELECT "users".* FROM "users" WHERE "users"."id" = ? LIMIT ? [["id", 1], ["LIMIT", 1]] Rendering users/show.html.erb within layouts/application Micropost Exists (0.1ms) SELECT 1 AS one FROM "microposts" WHERE "microposts"."user_id" = ? LIMIT ? [["user_id", 1], ["LIMIT", 1]] (0.1ms) SELECT COUNT(*) FROM "microposts" WHERE "microposts"."user_id" = ? [["user_id", 1]] Rendered users/show.html.erb within layouts/application (3.2ms) Rendered layouts/_shim.html.erb (0.3ms) User Load (0.2ms) SELECT "users".* FROM "users" WHERE "users"."id" = ? LIMIT ? [["id", 1], ["LIMIT", 1]] Rendered layouts/_header.html.erb (1.9ms) Rendered layouts/_footer.html.erb (0.3ms) Completed 200 OK in 50ms (Views: 47.2ms | ActiveRecord: 0.6ms)

このような状況ですが、どこに原因があると考えられるでしょうか。
ご回答、よろしくお願いいたします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

google翻訳
'nil'はActiveModel互換オブジェクトではありません

ということなので、エラーが出たあたりの変数がnilになってないかチェックしてみては

投稿2019/10/27 23:55

y_waiwai

総合スコア88040

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

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

ketyan

2019/10/28 01:42

Y_waiwaiさん、ご回答ありがとうございます。 恥ずかしながら、@micropostsを定義したメソッドよりも後に、同変数を定義するメソッドが残っていたために起きていたエラーでした。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問