Ошибка Ruby on Rails: ошибка произошла при оценке nil.each - PullRequest
1 голос
/ 02 декабря 2010

Я пытаюсь изучить Ruby, но я получаю эту ошибку:

Произошла ошибка при оценке nil.each

Я читал здесь руководство "Начало работы" http://guides.rubyonrails.org/getting_started.html

Вот фрагмент кода из index.html.erb:

<h1>Listing snippets</h1>
<div class="snippets">
<% @posts.each do |post| %>
    <h2><%= post.title %></h2>
    <p><%= link_to 'View', post %> | <%= link_to 'Edit', edit_post_path(post) %> | <%= link_to 'Delete', post, :confirm => 'Are you sure?', :method => :delete %></p>
<% end %>
</div>

Теперь @ posts var в posts_controller.rb

def index
    @posts = Post.all

    respond_to do |format|
      format.html # index.html.erb
      format.xml  { render :xml => @posts }
    end
  end

Что я делаю не так? Спасибо.

PS: я вижу, что они отображаются здесь http://127.0.0.1:3000/posts, но что, если я хочу отобразить их в корневой папке (http://127.0.0.1:3000/)

Ответы [ 3 ]

2 голосов
/ 02 декабря 2010

Вы должны сделать частичное и поместить в него эту логику постов.

Затем вы можете поместить его в любое представление, пока вы инициализируете коллекцию внутри каждого используемого действия контроллера..

Так что в вашем домашнем контроллере вам все равно понадобится:

@posts = Post.find(:all)

Что касается вашего первого вопроса, попробуйте найти их через @posts = Post.find(:all)

1 голос
/ 02 декабря 2010

Ошибка (как вы, вероятно, подозревали) происходит в следующей строке:

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

Каким-то образом @posts в конечном итоге становится нулевым, даже если мы хотим, чтобы это был список.

Это немного странно, потому что приведенный выше код выглядит так, как будто он должен работать.Я постараюсь помочь вам отследить проблему.

Post.all эквивалентен Post.find (: all), и согласно документации для find он может вернуть ноль, но я не знаю, когда это когда-нибудь случится на практике.Обычно он должен возвращать пустой список ([]), если в базе данных нет записей, или выдавать исключение, если таблица базы данных вообще не существует.

Так что на всякий случай Post.all каким-то образомвозвращает ноль, попробуйте @posts = [] вместо @posts = Post.all в контроллере..each должен работать тогда.

Если (как я подозреваю) это не так, я предполагаю, что каким-то образом контроллер, отличный от того, который вы опубликовали выше, будет выполнен.Тогда, поскольку @posts никогда не был установлен, попытка доступа к нему просто даст вам ноль, что объясняет ошибку.Так что проверьте ваши пути и имена классов, и убедитесь, что код, который, по вашему мнению, запускается на самом деле запускается.

Надеюсь, что это поможет вам выяснить, что идет не так - и дайте нам знатьрешил проблему за вас!

1 голос
/ 02 декабря 2010

Добавить маршрут к route.rb (только для Rails 2.x):

map.root :controller => "posts", :action => "index"

Для Rails 3.x посмотрите здесь: http://guides.rubyonrails.org/routing.html#using-root

Ошибка при оценке nil.each означает, что @posts не является массивом. Вы создали таблицу сообщений?

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