未定义的方法each Rails错误

5
我在阅读位于http://ruby.railstutorial.org的教程时,学习了Ruby on Rails。我成功创建了用户并能够在以下位置显示他们的名称和Gravatar:
http://localhost:3000/users/1

现在,当用户访问时,我想显示所有用户:
http://localhost:3000/users/

这是我的控制器:

class UsersController < ApplicationController

  def index
    @user = User.all
  end      

  #...
end

这是我的观点。
#View for index action in user's controleer

<h1>All users</h1>

<ul class="users">
  <% @users.each do |user| %>
    <li><%= user.content %></li>
  <% end %>
</ul>

我遇到了以下错误。
undefined method `each' for nil:NilClass

请问有人能告诉我为什么首页不能按照我的要求工作吗?


3
еңЁжӮЁзҡ„жҺ§еҲ¶еҷЁзҡ„зҙўеј•ж“ҚдҪңдёӯпјҢе°ҶеҸҳйҮҸ@userйҮҚе‘ҪеҗҚдёә@users ;) - MrYoshiji
@MrYoshiji是正确的,@user被取消设置,当您尝试访问实例变量时,它们会采用默认值nil,因此@usersnil,但@user已设置。 - Lee Jarvis
1个回答

14

问题来自于不存在的@users变量:

在您的索引操作中,将@user设置为所有用户:

def index
  @user = User.all
end
按照惯例,在从数据库检索多个条目时,我们使用复数名称,这就是为什么在视图中调用@users(注意 's')的原因。只需将您的@user重命名为@users即可解决问题 ;)
def index
  @users = User.all
end

好的 - 这可能有效,但你能解释一下原因吗?我的意思是这是一个变量,对吧?而且我不知道有哪种语言会严格限制变量名 - 那么为什么在Rails中会这样呢? - Mani
Rails并不限制您使用特定的复数名称,但按照惯例,最好根据变量命名:@users是描述多个User记录列表的最佳变量名称。 - MrYoshiji
好的,这是我的问题,即如果Rails没有限制我,而只是一个约定,那么为什么它会出现错误-未定义的方法each? - Mani
1
因为您在视图中没有使用完全相同的变量名称。如果您在控制器的操作中定义了@whatever = User.all,则必须在视图中使用变量@whatever - MrYoshiji

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接