2017-02-14 8 views
0

私はモデルPersonを持っていて、私のウェブサイトのホームページにすべての「人」をリストしたいと思います。定義されていないメソッド `each 'for nil:NilClass - ホームページ上でのみレンダリングするとき

私はこのために部分的な_index.html.erbを作成しました。したがって、私のウェブサイトのどこでもこのリストを使用することができました。 index.html.erbでは、私はこの部分をレンダリングします。

http://localhost:3000/people/http://localhost:3000/people/indexの両方が正常に実行されます。しかし、私はまた、私のホームページでインデックスの部分を使いたいと思っていました。そこでは、それは次のエラーを与える:

undefined method `each' for nil:NilClass

私のコードのいくつかの部分:

人/ _index.html.erb

<h2>The following people exist:</h2> 
<table> 
    <tr> 
    <th>Name</th> 
    </tr> 
    <% @people.each do |p| %> 
     <tr> 
     <td><%= p.name %></td> 
     </tr> 
    <% end %> 
</table> 

人/ index.html.erb

<%= render 'people/index' %> 

pa GES/index.html.erb(これは私のホームページです)

<h1>Homepage</h1> 

<%= render 'people/new' %> 
<%= render 'people/index' %> 

routes.rbを:

Rails.application.routes.draw do 
    root 'pages#index' 
    get 'pages/index' 
    get 'people/index' 
    resources :people 
end 

people_controller.rbのパート:どういうわけか

class PeopleController < ApplicationController 

    def index 
    @people = Person.all 
    end 

    def show 
    @person = Person.find(person_params) 
    end 

... 

、レンダリング私が<%= render 'people/index' %>をコメントアウトすると、人々/新しい(部分的にも)完全にうまく動作します。

このエラーを検索すると、主に「あなたがコントローラーで@peopleを正しく定義していませんでした」という解決策が導かれます。ただし、/ people/indexページではうまく動作しますが、ホームページでレンダリングするときにはうまくいかないのはなぜですか?ルーティングの問題ですか?

私の質問がはっきりしていて、十分なコードスニペットを投稿していただき、ありがとうございました。

答えて

2

あなたのホームページをレンダリングするときにpages/indexルートを打ったとき、@peopleが定義されていないと呼ばれているPagesController、そう@peoplenilなってしまうと、エラーが発生しました。

PagesControllerのどこかに@people = People.allを追加する必要があります。PeopleControllerは、ホームページにアクセスしたときに実際に呼び出されないためです。

development.logを確認すると、ホームページとpeople/_index部分レンダラーにアクセスしたときにPeopleControllerが呼び出されないことがわかります。

0

undefined method 'each' for nil:NilClassは、それぞれあなたに何かを呼び出すことを意味します。は、があると思いますが、そうではありません。この場合、あなたの呼び出しは@people.eachですが、実際には@peopleはゼロです。だからあなたはそのエラーを見る。あなたのコントローラーで実際にそのページに燃料を供給しているアクション/方法で@people = People.allを設定してください。あなたがショーページにいれば、それはショーの方法になるでしょう。編集ページで、コードが編集メソッドにあることを確認します。

+1

こんにちは、助けてくれてありがとう!ホームページから私は部分的な_indexを呼び出します。これは、ページを「給油する」アクションがPeopleController内のアクション「インデックス」であることを意味します。そしてそこに私は本当にPerson.allに@peopleを設定しました.... 私は部分的に呼んでいるのですか? – Teresa

+0

@ user133910 "PeopleController内でアクション 'indexing'となるページに「燃料を供給する」アクションがあります - あなたはホームページを開いていませんか?この場合、PeopleControllerはそれとは関係ありません。 –

+1

確かに、それが私のミスをした場所です!私は '@ people'を私のPagesControllerに追加し、問題は解決されました。ありがとう! – Teresa

関連する問題