Передача данных через переменную экземпляра из контроллера в представление, что я делаю не так? - PullRequest
0 голосов
/ 30 мая 2009

Я пытаюсь написать свое первое пользовательское действие контроллера и запускаю 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.)

1 Ответ

2 голосов
/ 30 мая 2009

Это правильно:

  respond_to do |format|
    format.html { render :layout => 'posts' }
    format.xml { render :xml => @posts }
  end
end

@ posts не были распознаны представлением, поскольку оно было создано после того, как вы отобразили представление. 'render' должен быть последней выполненной строкой в ​​действии.

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