问题 rails undefined方法`each'代表nil:NilClass


我正在按照教程找到 这里。这很简单,我按照说明完全按照步骤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

8835
2017-10-22 16:34


起源

你可以做 @foo = "bar" 在控制器中然后成功做到了 <%= @foo %> 在视图中? - Jason Swett
index.html.erb是位于views / posts /里面的吗? - ewiinnnnn
@JasonSwett我没有收到错误,但“bar”没有显示在页面上。此index.html.erb位于views / home /中。我应该尝试使用views / posts / index.html.erb吗? - Jonathan Hwa
您的视图必须位于相应的控制器目录中。如果你的方法是 index 在 - 的里面 PostsController, 你的 index.html.erb 应该在里面 views/posts/。 - Lucas Nogueira
哦哇,显然我不明白ROR是如何工作的! Lucas Nogueira完全正确 - 这解决了它。你们都认为我使用的教程很好吗?或者你会推荐一个更好的? - Jonathan Hwa


答案:


为了 views 要在Rails中正常工作,它们必须位于正确的目录中。这是所谓的“所谓”的众多实现之一约定优于配置“那个Rails喜欢。

所以,如果你有一个方法 index 并且此方法位于名为的控制器内 PostsController,你必须有一个名为的视图 index 在目录中 views/posts/。这样,Rails将知道在处理get方法时必须呈现此视图。

关于一个很好的教程,我会推荐这个 。它是extense并涵盖了很多与Rails本身不相关的东西,比如在Heroku和一些CSS上进行部署。


11
2017-10-22 17:21



非常感谢!我一直在努力拼凑关于Heroku和Git的元素,但这似乎就像你说的那样将它们联系在一起。再次感谢!我会回答你的答案,但我没有足够的声誉。 - Jonathan Hwa
我赞成他哈哈。还有一件事:你可以用一个动作渲染你想要的任何视图(或部分) render 命令。所以,例如,如果由于某种原因你真的需要你的 index.html.erb 文件要进去 views/home,在您的帖子控制器的索引操作中,您可以键入: render "home/index"。 - MrDanA
好吧@MrDanA。但由于他刚刚开始,我会更好地保持简单的最终答案:) - Lucas Nogueira
我同意!我希望Jonathan将来会留意它! - MrDanA
是的,我已经开始研究你发布的教程了。感谢所有提供意见的人!知道如何学习新语言,你可能希望再次见到我:) - Jonathan Hwa