Следовал учебнику по Rails и получил контроллер действий: исключение обнаружено? - PullRequest
0 голосов
/ 16 января 2012

Я следую учебнику railstutorial.org о микросообщениях.

У меня следующая ошибка:

NoMethodError in Pages#home

Showing /home/alex/apps/sample_app/app/views/shared/_error_messages.html.erb where line #1 raised:

You have a nil object when you didn't expect it!
You might have expected an instance of ActiveRecord::Base.
The error occurred while evaluating nil.errors
Extracted source (around line #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 %> user from being saved:</h2>
Trace of template inclusion: app/views/shared/_micropost_form.html.erb, app/views/pages/home.html.erb

Rails.root: /home/alex/apps/sample_app

Application Trace | Framework Trace | Full Trace
app/views/shared/_error_messages.html.erb:1:in `_app_views_shared__error_messages_html_erb__227730281_80967500'
app/views/shared/_micropost_form.html.erb:2:in `block in _app_views_shared__micropost_form_html_erb___680753694_80558240'
app/views/shared/_micropost_form.html.erb:1:in `_app_views_shared__micropost_form_html_erb___680753694_80558240'
app/views/pages/home.html.erb:6:in `_app_views_pages_home_html_erb__571228236_80133470'

_error_messages.html.erb:

<% if @user.errors.any? %>
  <div id="error_explanation">
    <h2><%= pluralize(@user.errors.count, "error") %> 
        prohibited this <%= object.class.to_s.underscore.humanize.downcase %> user from being saved:</h2>
    <p>There were problems with the following fields:</p>
    <ul>
    <% @user.errors.full_messages.each do |msg| %>
      <li><%= msg %></li>
    <% end %>
    </ul>
  </div>
<% end %>

home.html.erb:

<% if signed_in? %>
  <table class="front" summary="For signed-in users">
    <tr>
      <td class="main">
        <h1 class="micropost">What's up?</h1>
        <%= render 'shared/micropost_form' %>
      </td>
      <td class="sidebar round">
        <%= render 'shared/user_info' %>
      </td>
    </tr>
  </table>
<% else %>
  <h1>Sample App</h1>

  <p>
    This is the home page for the
    <a href="http://railstutorial.org/">Ruby on Rails Tutorial</a>
    sample application.
  </p>

  <%= link_to "Sign up now!", signup_path, :class => "signup_button round" %>
<% end %>

_micropost_form.html.erb:

<%= form_for @micropost do |f| %>
  <%= render 'shared/error_messages', :object => f.object %>
  <div class="field">
    <%= f.text_area :content %>
  </div>
  <div class="actions">
    <%= f.submit "Submit" %>
  </div>
<% end %>

microposts_controller.html.erb:

class MicropostsController < ApplicationController
  before_filter :authenticate

  def create
    @micropost = current_user.microposts.build(params[:micropost])
    if @micropost.save
      flash[:success] = "Micropost created!"
      redirect_to root_path
    else
      render 'pages/home'
    end
  end

  def destroy
  end
end

pages_controller.html.erb

class PagesController < ApplicationController
  def home
        @title = "Home"
    @micropost = Micropost.new if signed_in?
  end

  def contact
        @title = "Contact"
  end

    def about
        @title = "About"
    end

  def help
    @title = "Help"
  end
end

Я проверял учебник снова и снова, и все выглядит точно так же.

Есть предложения, чтобы это исправить?

Ответы [ 4 ]

2 голосов
/ 16 января 2012

У вас, кажется, нет переменной @user в вашем действии home. Следовательно, @user равно нулю. Предполагая, что вы точно следовали разделам аутентификации, попробуйте назначение: @user = current_user.

0 голосов
/ 25 февраля 2012

Для _error_messages.html.erb все @users должно быть object.

Вот моя копия _error_messages.html.erb:

<% if object.errors.any? %>
  <div id="error_explanation">
    <h2><%= pluralize(object.errors.count, "error") %> 
        prohibited this <%= object.class.to_s.underscore.humanize.downcase %> 
        from being saved:</h2>
    <p>There were problems with the following fields:</p>
    <ul>
    <% object.errors.full_messages.each do |msg| %>
      <li><%= msg %></li>
    <% end %>
    </ul>
  </div>
<% end %>
0 голосов
/ 16 января 2012

Я думаю, что это как-то связано с действием home в контроллере Pages. Можете выложить код из Pages # home?

Edit: Да, видите, вы не определили пользователя - @ user.

0 голосов
/ 16 января 2012

@user равно nil на данный момент:

Extracted source (around line #1):

1: <% if @user.errors.any? %>

nil не имеет свойства errors, поэтому создается исключение.

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