Rails异常:Action Controller sort_by nil:尝试错误处理时的NilClass

时间:2013-07-11 20:55:44

标签: ruby-on-rails

我对Ruby on Rails有点新手(并且已经爱上了它)并试图创建一个非常简单的webapp,在一个页面上列出提交表单和“feed”的帖子。我从Michael Hartl的精彩Rails教程中获得了很多这些编程概念。

发布工作正常;提交表单时没有表单数据(测试错误处理)时会抛出错误。

抱歉新手问题,但我真的很想学习,非常感谢你的帮助。

我一遍又一遍地搜索这些异常,我似乎无法追踪它。我认为问题出在@posts = Post.all行,我认为它正在拉动未保存的空帖,但这是我能得出的唯一结论,修复它的方法并不明显对我来说。

如果您需要更多代码,我很乐意发布,非常感谢您的帮助!

以下是引发错误的违规代码:

/app/controllers/posts_controller.rb

class PostsController < ApplicationController
  def index
    @posts = Post.all
    @post = Post.new
  end

  def create
    @post = Post.new(params[:post])
    if @post.save
      redirect_to '/', :flash => { :success => "Awesomesauce! Your post has been broadcast (like a boss)!" }
    else
      @post.destroy
      render 'index'
    end
  end

  def destroy
    @post = Post.destroy
  end

end

/app/models/post.rb

class Post < ActiveRecord::Base
  attr_accessible :author, :location, :text

  validates :author, presence: true
  validates :text, presence: true, length: {maximum: 140}


end

index.html.erb (我在这里截断了一些不相关的代码)

<div class="span8 center">
        <%= render partial: "shared/flash_messages", flash: flash %>
        <%= render 'shared/post_form' %>
        <h4>Latest posts <span class="label label-info">Updated LIVE</span></h4>
        <ol class="posts">
            <% @posts.sort_by{|t| - t.created_at.to_i}.each do |post|%>
            <li>
                <span class="content"> <%= post.text %> </span>
                <span class="content muted">Posted <%= time_ago_in_words(post.created_at) %> ago by <%= post.author %> in <%= post.location %>. </span>
            </li>
            <% end %>

/config/routes.rb

match '/', to: 'posts#index'
  resources :posts

抛出的错误如下:

undefined method `sort_by' for nil:NilClass
Extracted source (around line #14):

11:         <%= render 'shared/post_form' %>
12:         <h4>Latest posts <span class="label label-info">Updated LIVE</span></h4>
13:         <ol class="posts">
14:             <% @posts.sort_by{|t| - t.created_at.to_i}.each do |post|%>
15:             <li>
16:                 <span class="content"> <%= post.text %> </span>
17:                 <span class="content muted">Posted <%= time_ago_in_words(post.created_at) %> ago by <%= post.author %> in <%= post.location %>. </span>

3 个答案:

答案 0 :(得分:0)

调用render 'index'不会在#index操作中运行代码。它只呈现模板。因此,当您的Post创建失败并呈现索引时,@posts未定义。

答案 1 :(得分:0)

create条件中,您应指定要渲染的操作:

render :action => :index

这将提示ActionController完全重新呈现index操作,同时在内存中保留某些元素(包括验证错误消息),以便它们可供视图使用。

您当前的代码失败,因为render 'index'呈现app/views/posts/index.html.erb 模板 index 行动< / em>的。因为您尚未在@posts操作中实例化create实例变量,所以模板无法使用它,因此当您尝试迭代{{{{}}时会出现nil:NilClass错误1}}。

渲染@posts操作而不是模板,解决了所有这些问题。

答案 2 :(得分:0)

您可以考虑将redirect_to '/'render 'index'替换为redirect_to root_pathredirect_to posts_path。这样你就可以在他们的家中管理你的路线,config / routes.rb并且它们不是硬编码的。