2009-10-08 10 views
6

私はビュー(.html.erb)で、次のいますルビーオンレール:リストの各項目のレンダリングパーシャル

<% @posts = GetAllPostsFunctions %> (removed for berivity) 

<% @posts.each do |post| %> 
<%= post.title %> 

<%= render :partial => "posts/post_show" %> 
<% end %> 

部分posts_showは以下があります。

.... 
<td><%=h @post.title %> </td> 

しかし、私は次のエラー

You have a nil object when you didn't expect it! 
The error occurred while evaluating nil.title 

どれでもアイデアを得ますか?

答えて

7

各ループでのポスト変数を使用して、部分的にそれを利用できるようにする必要があり、ロケール変数であるので:

<%= render :partial => "posts/post_show", :locals => {:post => post} %> 

あなたは、ローカル変数のポストを通じてタイトルにアクセスすることができます。

<td><%=h post.title %> </td> 
は、

投稿をコレクションとしてレンダリングすることで、全体を単純化することもできます。詳細については、Railsのドキュメントを見てみましょう:

http://api.rubyonrails.org/classes/ActionController/Base.html#M000658

+0

素晴らしい、ありがとう! – cbrulak

0

部分の@postを設定しているようには見えないので、部分を評価するときはnull参照を取得します。

代わりに、あなたのポストフェッチ機能は、実際に私は肯定的ではないんだけど、私はあなたを誤解している場合、部分的にあなたがpost.titleない@post.title

申し訳ありませんをしなければならないと思うが、私に何か

+0

このように、 '投稿'オブジェクトを部分に渡すにはどうすればよいですか? – cbrulak

+0

私より良い答えを見てください:) – MBillock

0

に戻ってきていることを確認してください新しいレールです。

15

することもでき、単に使用して物事:レンダリングのためのコレクションを:部分。あなたの部分的な名前を共有するローカル変数へのコレクションの値の各項目を渡します。この場合

<% @posts = GetAllPostsFunctions %> (removed for berivity) 

<%= render :partial => "posts/post_show", :collection => @posts %> 

、Railsは現在の項目に設定されたローカル変数post_showと@postsの各項目のpost_showをレンダリングします。また、便利なカウンターメソッドを提供します。

このアプローチを成功させるには、app/views/posts/_post_show.html.erb partialをapp/views/posts/_post.html.erbに名前を変更するか、partial内の投稿のすべての出現をpost_showに変更する必要があります。

@posts変数内のすべての単一のポストのため部分的にレンダリングされます
<%= render :partial => @posts %> 

を:あなたは、あなたが簡単に行うことができます従来の_post.html.erbに部分的に名前を変更した場合。

関連する問題