【问题标题】:Cant get users from my db, undefined method `each' for nil:NilClass "rails tutorial"无法从我的数据库中获取用户,nil 的未定义方法“每个”:NilClass“rails 教程”
【发布时间】: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


【解决方案1】:

很奇怪User.all 返回的是nil,而不是一个空数组[]。请尝试以下操作:

  1. 确保您已运行任何待处理的迁移

    rake db:migrate
    
  2. 如果上一步没有运行任何迁移,请尝试擦除您的数据库并重新开始,以防万一:

    rake db:drop
    rake db:create db:migrate db:seed
    
  3. 进入 Rails 控制台,确保 User.all 行为正确

    rails c
    >> User.all
      User Load (0.4ms)  SELECT "users".* FROM "users" 
    => []
    >> exit
    
  4. 如果这一切正常,请尝试将一些调试语句放入您的控制器(使用 pry 或 ruby​​ 调试器是最佳的,但这里即使是一些 puts 语句也足够了)以检查 @users 的值

  5. 接下来,您需要向数据库中添加一些种子(编辑 db/seeds.rb 并运行 rake db:seed)或使用脚手架表单添加一些用户。

【讨论】:

  • 好的,在 Ben Taitelbaum 的帮助下,解决方案非常简单,并且还要求自己学习一些不同的调试方法,这很棒。我使用 Rails.logger.debug 来完全理解发生了什么,并发现我的 def show 方法在我的 def 索引之前被调用并取消它。我只是在我的控制器中将 def index 移到 def show 上,瞧。谢谢各位
【解决方案2】:

另一个真正有用的调试工具是 pry gem。你可以在github上找到它。

它将在代码中您放置命令的位置停止程序执行:

绑定.pry

并允许您拥有一个 rails consol- 访问变量、调用方法...等等。

这是一个非常方便的调试工具。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-01-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-23
    • 2017-08-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多