Я пытаюсь написать свое первое пользовательское действие контроллера и запускаю NoMethodError.
Сценарий: PostsController со стандартными 7 действиями, которые создает леса.
Я хочу, чтобы на индексной странице отображался один пост, а не их список. Каждый пост имеет «видимый» флажок. Я создал named_scope
с именем visible
в модели Post с:
named_scope :visible, :conditions => ["visible =?", true]
и применил его вместе с .last к действию index в моем контроллере:
def index
@post = Post.visible.last
(format stuff)
end
Отредактировал мое представление индекса, чтобы удалить итерации по части массива, чтобы оно показывало @post.title
и т. Д. Так что теперь мой индекс просто отображает последнюю запись в таблице Posts с True на видимом.
Затем я хочу создать страницу архива всех сообщений, которая показывает их все независимо от видимости, поэтому я создал новое действие контроллера:
( отредактировано для ясности )
def archives
render :layout => 'posts'
@posts = Post.find(:all)
respond_to do |format|
format.html
format.xml { render :xml => @posts }
end
end
создал новый именованный маршрут:
map.archives 'posts/archives', :controller => 'posts', :action => 'archives'
и представление с именем archives.html.erb под представлениями / публикациями.
Archives.html.erb выглядит точно так же, как стандартный шаблон index.html.erb, который создает скаффолдинг, с
<% for post in @posts %>
<tr>
<td><%=h post.title %></td>
...
</tr>
<% end %>
Когда я просматриваю эту страницу в своем браузере, я получаю сообщение об ошибке
NoMethodError в сообщениях # архивов
У вас есть нулевой объект, когда вы его не ожидали, возможно, вы ожидали isntance of Array, ошибка возникла при оценке nil.each,
указывает на строку в представлении (app / views / posts / archives.html.erb), которая говорит
<% for post in @posts %>
поэтому я понимаю, что данные из переменной экземпляра в действии контроллера archives
не передаются в представление, поэтому вместо массива сообщений у меня ноль. Я ищу причину, почему и что я делаю неправильно.
(Конечно, если я поставлю
<% @posts = Post.find(:all) %>
до
<% for post in @posts %>
в представлении, тогда это работает просто отлично, но я знаю, что это не то, что я должен делать.
Вся помощь, ссылки на учебники, чтобы исправить меня, и т. Д. Очень ценится.
(Я сомневаюсь, что это имеет значение для чего-то такого простого, но я использую Rails 2.2.2 и Ruby 1.8.6.)