Undefined метод `each 'для nil: NilClass... почему?

пример направляющих рельсов, нажмите кнопку "Сохранить сообщение", консоль покажет это сообщение:

Начал POST "/сообщений" за 127001 в 2013-12-25 22:42:04 +0800 Обработка по PostsController # create as HTML Parameters: { "utf8" = > "✓", "authenticity_token" = > "CLalUww3gqnSlED0AWdou6P/U2qya vPqDiBANQOuYgA =", "post" = > { "title" = > "11", "text" = > "22" }, "commit" = > "Сохранить сообщение" } (0.0ms) начать транзакцию (0.0ms) Откат транзакции Переадресован на http://127001: 3000/posts Завершено 302 Найдено в 16 мс (ActiveRecord: 0.0ms)

Запущен GET "/posts" для 127001 в 2013-12-25 22:42:04 +0800 Обработка по PostsController # index как HTML Rendered posts/index.html.erb в макетах/приложении (15.6мс) Завершено 500 Внутренняя ошибка сервера в 31 мс

ActionView:: Template:: Error (undefined метод `each 'для ноль: NilClass):

        <th>Text</th>
        </tr>
        <% @posts.each do |post| %>

=============================================== =======

маршруты правильные, почему сообщение - это нуль? рельсы 4.0.2 ruby ​​2.0

Ответ 1

В вашем контроллере сообщений вам нужно определить @posts, который, на основании ошибки, вы этого не сделали.

# app/controllers/posts_controller.rb
class PostsController < ApplicationController
  def index
    @posts = Post.all
  end
end 

Поскольку @posts не определен, вызов each на нем будет генерировать undefined method каждый 'для nil: NilClass`.

Ответ 2

Чтобы больше узнать об этой ошибке, с которой вы сталкиваетесь,

  undefined method `each' for nil:NilClass

Ошибка явно жалуется на то, что вы вызываете каждый метод на что-то здесь (@posts), которое равно нулю. Это означает, что вы не определили его в своем контроллере. Поскольку вы не определили его, почему он жалуется на метод undefined для класса nil.

Пожалуйста, обязательно проверяйте, когда вы вызываете переменную экземпляра из вашего представления? вам необходимо определить, что в вашем контроллере будет доступным в представлениях.

Иногда вы также получаете эту ошибку, если вы вызываете частный метод в своем контроллере.