ruby-on-rails: рендеринг частей для каждого элемента в списке - PullRequest
6 голосов
/ 08 октября 2009

У меня есть следующее в представлении (.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

Есть идеи?

Ответы [ 4 ]

17 голосов
/ 09 октября 2009

Вы также можете просто вещи, используя: collection для рендеринга: частичный. Который передает каждый элемент в значении для: collection в локальную переменную, разделяющую имя вашей части.

<% @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 в app / views / posts / _post.html.erb или изменения каждого вхождения записи в вашем частичном post_show Если вы переименовали партиал в обычный _post.html.erb , который позволит вам просто сделать:

<%= render :partial => @posts %>

Что будет отображать частичное для каждого поста в переменной @posts.

7 голосов
/ 09 октября 2009

Поскольку переменная post в каждом цикле является локальной переменной, вы должны сделать ее доступной для частичного:

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

Затем вы можете получить доступ к заголовку через локальную переменную post:

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

Вы также можете упростить все это, представив сообщения как коллекцию. Посмотрите документацию по Rails для получения дополнительной информации:

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

0 голосов
/ 09 октября 2009

Я не уверен, но я думаю, что в частичной вы должны сделать post.title не @post.title

Извините, если я вас неправильно понял, я новичок в рельсах.

0 голосов
/ 09 октября 2009

Не похоже, что вы устанавливаете @post партиала, поэтому, когда он оценивает партиал, он получает нулевую ссылку.

В качестве альтернативы, убедитесь, что ваши функции выборки постов действительно что-то возвращают

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...