NoMethodError в Pages # home - PullRequest
       5

NoMethodError в Pages # home

4 голосов
/ 15 октября 2010

Я работаю через онлайн-книгу по railtutorial.org для рельсов 3. Я прошел через большую часть главы 11, где мы добавили возможность отправлять микросообщения. После добавления соответствующего кода я не могу отобразить страницу. Ниже приведена ошибка:
>

NoMethodError in Pages # home

Показывает c: /rails_projects/sample_app/app/views/shared/_error_messages.html.erb, где поднялась строка> # 1:

У вас есть нулевой объект, когда вы этого не ожидали! Возможно, вы ожидали экземпляр ActiveRecord :: Base. Произошла ошибка при оценке nil.errors Извлеченный источник (вокруг строки # 1):

1 <% if @user.errors.any? %>
2: <div id="error_explanation">
3: <h2><%= pluralize(@user.errors.count, "error") %>
4: prohibited this <%= object.class.to_s.underscore.humanize.downcase %>
Трассировка включения шаблона: app / views / shared / _micropost_form.html.erb,> app / views / pages / home.html.erb

Страница будет отображаться правильно, если я удалю следующую строку из app \ views \ shared_micropost_form.html.erb <% = визуализация 'shared / error_messages',: object => f.object%>

Любая помощь приветствуется.

Ответы [ 3 ]

9 голосов
/ 15 октября 2010

это потому, что вы передаете переменную object в свой партиал, но в партиале вы пытаетесь использовать переменную с именем @user.Измените каждый экземпляр @user в этом частичном на object, и он будет работать нормально.

1:<% if object.errors.any? %>
2:<div id="error_explanation">
3:<h2><%= pluralize(object.errors.count, "error") %>
4:prohibited this <%= object.class.to_s.underscore.humanize.downcase %>

ОБНОВЛЕНИЕ: Просто чтобы прояснить, ответы выше предполагают, что есть ошибка сустановка переменной @user, но это нормально.Когда вы говорите :object => f.object в своем вызове рендеринга, вы говорите render взять объект, на котором основана эта форма, и отправить его частично - с именем переменной object.

Весь смысл рефакторинга кода ошибки в разделяемую частичку заключается в том, что он будет использоваться несколькими формами для разных моделей.Внутри партиала вы не можете сказать @user, потому что вы будете использовать этот же партиал для всех остальных ваших моделей.Вот почему код в части изменен для использования более общего имени переменной, object.

0 голосов
/ 15 октября 2010

Кажется, что в действии контроллера, к которому вы обращаетесь, нет переменной @user

Я бы попробовал

<% if @user && @user.errors.any? %>

, если есть @user, тогда он проверит @user.errors.any

также, если вы используете devise, вы можете попробовать

<% user_signed_in? && @user.errors.any? %>
0 голосов
/ 15 октября 2010

Это говорит о том, что объект @user равен нулю. Вы должны убедиться, что в вашем контроллере pages#home установлено значение @user. Если вы перенаправляете на домашнюю страницу после устранения ошибки в сообщении формы, у вас по-прежнему не будет переменной экземпляра @user после перенаправления. Это наиболее распространенная практика, если вы хотите включить исходные опубликованные значения в сообщение об ошибке публикации формы, чтобы отобразить представление, чтобы у вас все еще были под рукой опубликованные параметры:

# Some controller
def create
  begin
    @user = User.create(params[:user])
  rescue ActiveRecord::RecordInvalid => e
    @errors => e.record.full_error_messages
    render :action => "new"
  end
end

Я не уверен, что вы делаете в этом руководстве, но если вы опубликуете код, который находится в pages_controller # home, мы можем рассказать вам больше.

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