【发布时间】:2012-07-27 20:49:03
【问题描述】:
我正在关注 Michael Hartl 的 RoR 教程,我在第 9.3 章“显示所有用户”到目前为止一切都很好,但现在我得到一个未定义的方法 `each' 用于 nil:NilClass 尝试从SQLite 数据库。这是我的控制器
class UsersController < ApplicationController
before_filter :signed_in_user, only: [:index, :edit, :update]
before_filter :correct_user, only: [:edit, :update]
.
.
.
def index
@users = User.all
end
end
and my index.html.erb
<ul class="users">
<% @users.each do |user| %>
<li>
<%= gravatar_for user, size: 52 %>
<%= link_to user.name, user %>
</li>
<% end %>
</ul>
使用此代码,我得到错误 undefined method `each' for nil:NilClass
当我把它改成
<ul class="users">
<% if @users %>
<% @users.each do |user| %>
<li>
<%= gravatar_for user, size: 52 %>
<%= link_to user.name, user %>
</li>
<% end %>
<% end %>
</ul>
尽管我的数据库中有用户,但我可以渲染视图但显示 0 个用户。我手动创建了一些,还使用了“faker”gem 来生成一些。在 Rails 控制台中键入 User.all 会返回一个包含 100 个用户的数组。我似乎无法在这里找到缺失的链接。我还使用 SQlite 数据库浏览器应用程序来检查我的用户模型,其中我也有 100 个用户。 我为此做了很多工作,但似乎无法弄清楚。
这也是我的 User.rb
class User < ActiveRecord::Base
attr_accessible :name, :email, :password, :password_confirmation
has_secure_password
before_save { |user| user.email = email.downcase }
before_save :create_remember_token
validates :name, presence: true, length: { maximum: 50 }
VALID_EMAIL_REGEX = /\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z/i
validates :email, presence: true,
format: { with: VALID_EMAIL_REGEX },
uniqueness: { case_sensitive: false }
validates :password, presence: true, length: { minimum: 6 }
validates :password_confirmation, presence: true
private
def create_remember_token
self.remember_token = SecureRandom.urlsafe_base64
end
end
【问题讨论】:
-
你学习的下一步应该是调试的学习。非常简单,您可以使用 2 种方式进行调试。 Rails.logger.debug(some_var) 或使用“调试器”gem。确保您的 Gemfile 中有调试器 gem,然后在您获取控制器中的所有用户之后编写“调试器”。使用浏览器点击页面并返回运行服务器的终端,希望您会看到一个提示,您可以在其中检查@users 实例变量的值。
-
您能否评论/删除 signed_in_user 过滤器以检查它是否与问题有关?
标签: ruby-on-rails sqlite