我对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>
答案 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_path
或redirect_to posts_path
。这样你就可以在他们的家中管理你的路线,config / routes.rb并且它们不是硬编码的。