3

Michael HartlによるRoRチュートリアルと、9.3章「すべてのユーザーの表示」のimに従って、これまでのところすべてがうまく機能しましたが、SQliteデータベースからユーザーを取得しようとすると、nil:NilClassの未定義のメソッド「each」が表示されます。これが私のコントローラーです

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>

このコードを使用すると、nil:NilClassのエラー未定義メソッド`each'が発生します

そして、私がそれをに変更すると

<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人のユーザーを表示しています。私はいくつかを手動で作成し、「フェイカー」ジェムを使用していくつかを生成しました。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
4

2 に答える 2

3

が代わりに空の配列を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) か、スキャフォールディング フォームを使用してユーザーを追加します。

于 2012-07-30T08:11:44.377 に答える
0

もう 1 つの非常に役立つデバッグ ツールは、pry gem です。githubで見つけることができます。

コマンドを配置したコード内のポイントでプログラムの実行を停止します。

バインディング.こじる

Railsコンソールを使用して、変数にアクセスしたり、メソッドを呼び出したりできるようにします...何でも。

これは、デバッグ用の非常に便利なツールです。

于 2012-07-31T02:30:59.243 に答える