【问题标题】:rails undefined method `each' for nil:NilClassrails undefined method `each' for nil:NilClass
【发布时间】:2012-10-22 16:34:16
【问题描述】:

我正在学习找到here 的教程。这很简单,我完全按照步骤 6.7 的说明进行操作。此时,我收到错误

undefined method `each' for nil:NilClass 

当我尝试访问 rails 服务器上的 index.html.erb 时。

我知道数据库工作正常,因为我可以完成步骤 6.3 中提到的所有操作,创建新帖子并显示/编辑/销毁它们绝对没有问题。

具体来说,问题在于行

<% @posts.each do |post| %>

它本质上声称@posts 是零。

感谢您对这位 ROR 新手的任何帮助!谢谢。

index.html.erb

<h1>Hello, Rails!</h1>
<table>
  <tr>
    <th>Name</th>
    <th>Title</th>
    <th>Content</th>
    <th></th>
    <th></th>
    <th></th>
  </tr>

<% @posts.each do |post| %>
  <tr>
    <td><%= post.name %></td>
    <td><%= post.title %></td>
    <td><%= post.content %></td>
    <td><%= link_to 'Show', post %></td>
    <td><%= link_to 'Edit', edit_post_path(post) %></td>
    <td><%= link_to 'Destroy', post, :confirm => 'Are you sure?',
                                     :method => :delete %></td>
  </tr>
<% end %>
</table>

<br />

<%= link_to "My Blog", posts_path %>

posts_controller.rb

class PostsController < ApplicationController
  # GET /posts
  # GET /posts.json
  def index
    @posts = Post.all

    respond_to do |format|
      format.html # index.html.erb
      format.json { render json: @posts }
    end
  end

【问题讨论】:

  • 能不能在控制器里做@foo = "bar",然后在视图里成功做&lt;%= @foo %&gt;
  • 那个 index.html.erb 是位于 views/posts/ 内还是其他地方?
  • @JasonSwett 我没有收到错误消息,但页面上没有显示“栏”。这个 index.html.erb 位于views/home/。我应该用views/posts/index.html.erb 来代替吗?
  • 您的视图必须位于相应的控制器目录中。如果您的方法是 indexPostsController 内,您的 index.html.erb 应该在 views/posts/ 内。
  • 哦,哇,显然我不明白 ROR 是如何工作的! Lucas Nogueira 是完全正确的 - 这解决了它。大家觉得我用的教程好么?或者有更好的推荐吗?

标签: ruby-on-rails


【解决方案1】:

为了使views 在 Rails 中正常工作,它们必须位于正确的目录中。这是 Rails 喜欢的所谓“Convention over Configuration”的众多实现之一。

因此,如果您有一个方法 index,并且此方法位于名为 PostsController 的控制器内,则您必须在目录 views/posts/ 内有一个名为 index 的视图。这样一来,Rails 就会知道它必须在处理对该方法的 get 时呈现该视图。

关于一个好的教程,我会推荐这个one。它的范围很广,涵盖了很多不只是与 Rails 本身相关的东西,比如在 Heroku 上部署和一点 CSS。

【讨论】:

  • 非常感谢!我一直在尝试将有关 Heroku 和 Git 的元素拼凑在一起,但这似乎像您所说的那样将它们联系在一起。再次感谢!我会赞成你的回答,但我没有足够的声誉。
  • 我为他投了赞成票哈。不过还有一件事:您可以使用render 命令从操作中渲染您想要的任何视图(或部分视图)。因此,例如,如果出于某种原因您确实需要将您的 index.html.erb 文件放在 views/home 中,则在您的帖子控制器的索引操作中您可以输入:render "home/index"
  • @MrDanA 说得好。但是由于他才刚刚开始,我认为最好在最终答案上保持简单:)
  • 我同意!不过,我希望乔纳森将来会记住这一点!
  • 是的,我已经开始学习您发布的教程。感谢所有提供意见的人!了解学习新语言的过程,您可能会期待再次在这里见到我 :)
猜你喜欢
  • 2013-08-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-29
  • 1970-01-01
  • 1970-01-01
  • 2015-01-27
  • 2020-09-24
相关资源
最近更新 更多