0

我对 Ruby on Rails 有点陌生(并且已经很喜欢它了),并尝试制作一个非常简单的 web 应用程序,该应用程序在一个页面上列出带有提交表单和“提要”的帖子。我从 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>
4

3 回答 3

0

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

于 2013-07-11T21:46:16.740 回答
0

在您的create条件中,您应该指定要呈现的操作:

render :action => :index

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

您当前的代码失败,因为render 'index'呈现出app/views/posts/index.html.erb 模板,而不是index 动作。因为您还没有@posts在操作中实例化实例变量create,所以它对模板不可用,因此nil:NilClass当您尝试遍历@posts.

渲染index动作,而不是模板,解决了这一切。

于 2013-07-11T22:07:40.070 回答
0

您可能需要考虑将redirect_to '/'andrender 'index'替换为redirect_to root_pathor redirect_to posts_path。这样你就可以在他们的家 config/routes.rb 中管理你的路由,并且它们不会被硬编码。

于 2013-07-11T22:09:51.757 回答