遵循Rails教程并获得Action控制器:异常被捕获?

时间:2012-01-16 08:27:56

标签: ruby-on-rails

我正在关注railstutorial.org tutorial about microposts.

我遇到以下错误:

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 个答案:

答案 0 :(得分:2)

您的@user操作中似乎没有home变量。因此,@user为零。假设您完全遵循了身份验证部分,请尝试分配:@user = current_user

答案 1 :(得分:0)

此时

@usernil

Extracted source (around line #1):

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

nil没有属性errors,因此会抛出异常。

答案 2 :(得分:0)

我认为它与Pages控制器中的home动作有关。你可以发布Pages#home的代码吗?

编辑: 是的,看你还没有定义用户 - @user。

答案 3 :(得分:0)

对于_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 %>