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

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

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

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

Ruby on Rails 4

Ruby on Rails4はRubyによって書かれたオープンソースのウェブフレームワークです。 Ruby on Railsは「設定より規約」の原則に従っており、効率的に作業を行うために再開発を行う必要をなくしてくれます。

Q&A

解決済

1回答

7857閲覧

Railsアプリの「nil is not an ActiveModel-compatible object.」のエラーを解消したい

solt0723

総合スコア67

Ruby on Rails

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

Ruby on Rails 4

Ruby on Rails4はRubyによって書かれたオープンソースのウェブフレームワークです。 Ruby on Railsは「設定より規約」の原則に従っており、効率的に作業を行うために再開発を行う必要をなくしてくれます。

0グッド

1クリップ

投稿2016/08/06 09:51

編集2016/10/30 09:44

###前提・実現したいこと
下記のRails チュートリアルで作成したものをベースに
RailsでTwitterのようなテキスト/画像投稿のWEBサービスを開発中です。

http://railstutorial.jp

マイクロポスト(投稿)の一覧をサービスのランディングページで表示したいのですが、
タイトルのエラーが発生しておりなかなか解決できずに困っています。

Rails 4.2.2
Ruby 2.0.0
で開発をしています。

###発生している問題・エラーメッセージ
マイクロポスト(投稿)の一覧を表示する
サービスのランディングページにアクセスすると、
下記のエラーメッセージがブラウザで表示されます。

エラーメッセージ

ArgumentError in StaticPagesController#landing 'nil' is not an ActiveModel-compatible object. It must implement :to_partial_path.

vivaldiブラウザで、以下のスクショのエラー画面が表示されます。

イメージ説明
イメージ説明

###該当のソースコード
ブラウザで指摘されているエラー箇所の
app/views/static_pages/landing.html.erb:23:
のコードが下記です。

html

1 <% render @microposts %>

html全体のコードは下記のようになっています。
controllerで定義した@micropostsオブジェクトをランディングページで表示しようとしています。
(class="microposts"でマイクロポストの一覧を表示しようとしています。)

ファイルは下記に配置しています。
~/sample_app/app/views/static_pages/landing.html.erb

html

1<!-- landing.jsファイルを読み込み --> 2<%= stylesheet_link_tag "landing.js" %> 3 4<body style="padding-top: 0px;"> 5 6<div class="img-responsive top-image jumbotron" style="background-color: #F9F9F9;"> 7 <h1 style="color: white; font-family: 'Helvetica Neue'; font-weight: 100; letter-spacing: 0.5px; font-size: 600%; margin-top: 120px;"> 8 Lavz 9 </h1> 10 <h2 style="color: white; font-family: 'Helvetica Neue'; font-weight: 100; letter-spacing: 0.5px; font-size: 250%;"> 11 Share and Manage Protocols<br>in Biological Experiments 12 </h2> 13</div> 14 15<div class="container"> 16 <div class="buttons" style="text-align: center;"> 17 <%= link_to "Sign up", signup_path, class: "btn-lg btn-primary" %> 18 <%= link_to "log in", login_path, class: "btn-lg btn-default" %> 19 </div> 20</div> 21 22<ul class="microposts"> 23 <% render @microposts %> 24</ul> 25 26</body> 27 28<!-- landing.jsファイルを読み込み --> 29<%= stylesheet_link_tag "landing.js" %>

また、マイクロポスト(投稿)の一覧を定義するためにcontrollerのコードを以下のようにしています。

ファイルは下記に配置しています。
~/sample_app/app/controllers/static_pages_controller.rb

ruby

1class StaticPagesController < ApplicationController 2 3 def index 4 render :layout => 'landing' 5 @microposts = Micropost.paginate(page: params[:page]) 6 end 7....

ご参考までに、micropostのパーシャルは下記のようになっています。
(マイクロポストの一覧を表示するためのコードなどは書いていません。
パーシャルの理解が浅いので、ここに何かしら実装が必要なのかも、、
と思っています)

ファイルの配置場所は下記です。
~/sample_app/app/views/microposts/_micropost.html.erb

<li id="micropost-<%= micropost.id %>"> <%= link_to gravatar_for(micropost.user, size: 50), micropost.user %> <span class="user"><%= link_to micropost.user.name, micropost.user %></span> <span class="content"> <%= micropost.content %> <%= image_tag micropost.picture.url if micropost.picture? %> </span> <span class="timestamp"> Posted <%= time_ago_in_words(micropost.created_at) %> ago. <% if current_user?(micropost.user) %> <% link_to "delete", micropost, method: :delete, data: { comfirm: "You sure?" } %> <% end %> </span> </li>

追加情報など必要であればコメントいただけると大変助かります!

###試したこと
近しいエラーの質問がされていた、下記のstack over flowを参考に
オブジェクトの指定方法を
@micropostsから@user.micropostsにしてみましたが、
エラーも解消せず、そもそもユーザーに紐づくマイクロポストを表示したいわけではないので
元にもどしました。

###補足情報
Ruby on Rialsチュートリアルというサイトで作成したサービスをもとに
作ったサービスを、アップデートしているところです。

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

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

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

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

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

guest

回答1

0

ベストアンサー

この場合だとlandingのtemplateを当てるという形になると思うので、

def index @microposts = Micropost.paginate(page: params[:page]) render 'landing' end

このようなコードになると思います
(また、HTMLファイル内の<% render ~~ %>の部分で<%の後の=が抜けているようなのでここも=を付け加えて下さい)

render :layoutのlayoutはtemplateを当てはめる前の大本のレイアウトファイルを指定するもので、これらレイアウトファイルはapp/view/layoutsに格納されています。このレイアウトファイルの<%= yield %>にtemplateファイルが展開され、一つのHTMLになります

なので各ページのコンテンツはtemplateファイルに、サイトを構成するパーツ(サイドバーやフッター)はレイアウトファイルで作るのが良くあるパターンとなってます

投稿2016/10/31 08:45

kyonsuke19101

総合スコア86

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

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

solt0723

2016/12/13 14:05

回答ありがとうございます! (返信遅くなってすいません) コメントにいただいた render 'landing' ではエラーが解消されなかったのですが render 'static_pages/landing' とすることでエラーが解消されました! ファイルのディレクトリ構造が原因だったようで、パスを指定することで解決できました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問