wyc
wyc

Reputation: 55323

Followed a Rails tutorial and got Action controller: Exception caught?

I'm following the railstutorial.org tutorial about microposts.

I'm having the following error:

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

I've been checking the tutorial over and over again and everything looks exactly the same.

Any suggestions to fix this?

Upvotes: 0

Views: 676

Answers (4)

Huy
Huy

Reputation: 11206

For _error_messages.html.erb, all @users should be object.

Here is my copy of _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 %>

Upvotes: 0

iNulty
iNulty

Reputation: 923

I think it has something to do with the home action in the Pages controller. Can you post the code from Pages#home?

Edit: Yeah, see you haven't defined a user - @user.

Upvotes: 0

U-DON
U-DON

Reputation: 2140

You don't seem to have a @user variable in your home action. Hence, @user is nil. Assuming you followed the authentication sections exactly, try the assignment: @user = current_user.

Upvotes: 2

Julio Santos
Julio Santos

Reputation: 3895

@user is nil at this point:

Extracted source (around line #1):

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

nil does not have the property errors, hence an exception is thrown.

Upvotes: 0

Related Questions