本文介绍了Rails 教程:NoMethodError:nil:NilClass 的未定义方法 `each'的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我对 ruby​​ on rails 非常陌生,很可能遗漏了一些简单的东西.

I'm incredibly new to ruby on rails, and very likely missing something easy.

我一直在关注 Michael Hartl 的教程书.昨晚我停下来时一切都很好,但今天早上我把头撞到墙上试图找出这个错误.

I've been following through Michael Hartl's tutorial book. Everything was fine last night when I stopped, but this morning I am hitting my head on a wall trying to figure out this error.

我在第 8 章:测试清单 8.25.

I'm on Chapter 8: the test is listing 8.25.

我想我可能刚刚打错了字,所以我回到了今天早上开始的地方,直接从教程中复制了代码.尽管如此,当我运行测试时,我得到

I thought I may have just made a typo, so I went back to where I started this morning and just copied the code straight from the tutorial. Still, when I run the test I get

1) Error:
StaticPagesControllerTest#test_should_get_about:
ActiveRecord::Fixture::FormatError: ActiveRecord::Fixture::FormatError


Error:
StaticPagesControllerTest#test_should_get_about:
NoMethodError: undefined method `each' for nil:NilClass

这在以前从来都不是问题,所以这就是为什么我的头撞在墙上的原因.

That was never a problem before, so that's why I'm hitting my head on the wall.

在这些错误之后,我得到了

After those errors, I'm getting

10) Error:
UserTest#test_name_should_not_be_too_long:
ActiveRecord::Fixture::FormatError: ActiveRecord::Fixture::FormatError

静态页面控制器测试

require 'test_helper'

class StaticPagesControllerTest < ActionController::TestCase

def setup
  @base_title = "Ruby on Rails Tutorial Sample App"
end

test "should get home" do
  get :home
  assert_response :success
  assert_select "title", "Ruby on Rails Tutorial Sample App"
end

test "should get help" do
  get :help
  assert_response :success
  assert_select "title", "Help | #{@base_title}"
end

test "should get about" do
  get :about
  assert_response :success
  assert_select "title", "About | #{@base_title}"
end

test "should get contact" do
  get :contact
  assert_response :success
  assert_select "title", "Contact | Ruby on Rails Tutorial Sample App"
end

end

测试助手

ENV['RAILS_ENV'] ||= 'test'
require File.expand_path('../../config/environment', __FILE__)
require 'rails/test_help'

class ActiveSupport::TestCase
  # Setup all fixtures in test/fixtures/*.yml for all tests in alphabetical order.
  fixtures :all

  # Add more helper methods to be used by all tests here...
  # Returns true if a test user is logged in.
  def is_logged_in?
    !session[:user_id].nil?
  end
end

这是固定装置

michael:
name: Michael Example
email: michael@example.com
password_digest: <%= User.digest('password') %>

会话控制器

class SessionsController < ApplicationController

def new
end

def create
  user = User.find_by(email: params[:session][:email].downcase)
  if user && user.authenticate(params[:session][:password])
    # Log the user in and redirect to the user's show page.
    log_in user
    redirect_to user
  else
    # Create an error message.
    flash.now[:danger] = 'invalid email/password combination' # not
    quite right
    render 'new'
  end
end

def destroy
end

end

会话助手

module SessionsHelper

  # Logs in the given user.
  def log_in(user)
    session[:user_id] = user.id
  end

  # Returns the current logged in user (if any)
  def current_user
    @current_user ||= User.find_by(id: session[:user_id])
  end

  # Returns true if the user is logged in, false otherwise
  def logged_in?
    !current_user.nil?
  end
end

用户模型

class User < ActiveRecord::Base
    before_save { self.email = email.downcase }
    validates :name, presence: true, length: { maximum: 50 }
    VALID_EMAIL_REGEX = /\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z/i
    validates :email, presence: true, length: { maximum: 255 },
                      format: { with: VALID_EMAIL_REGEX },
                      uniqueness: { case_sensitive: false }

    has_secure_password
    validates :password, presence: true, length: { minimum: 6 }

    # Returns the hash digest of the given string.
      def User.digest(string)
        cost = ActiveModel::SecurePassword.min_cost ? BCrypt::Engine::MIN_COST :
                                                      BCrypt::Engine.cost
        BCrypt::Password.create(string, cost: cost)
      end
end

用户控制器

class UsersController < ApplicationController
  def show
    @user = User.find(params[:id])
  end

  def new
    @user = User.new
  end

  def create
    @user = User.new(user_params)
    if @user.save
        # handle a successful save
      log_in @user
        flash[:success] = "Welcome to the Sample App!"
        redirect_to @user
    else
        render 'new'
    end
  end

  private

    def user_params
        params.require(:user).permit(:name, :email, :password,
                                     :password_confirmation)
    end
end

任何帮助将非常感激!如果还有什么我需要发布的,请告诉我.

Any help would be GREATLY appreciated!Let me know if there's anything else I need to post.

推荐答案

使用缩进(fixture):

Use it indented (fixture):

michael:
  name: Michael Example
  email: michael@example.com
  password_digest: <%= User.digest('password') %>

这篇关于Rails 教程:NoMethodError:nil:NilClass 的未定义方法 `each'的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

08-04 02:58
查看更多