🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
CentOS

CentOSは、主にRed Hat Enterprise Linux(RHEL)をベースにした、フリーのソフトウェアオペレーティングシステムです。

Cloud9

Cloud9は、クラウドからのプログラミングが可能になるWebサービス。IDEとしての機能が搭載されており、GitHubやHerokuなど他ツールとの連携も可能です。ブラウザ上で動くため、デバイスに関係なく開発環境を準備できます。

ファイル

ファイルとは、文字列に基づいた名前又はパスからアクセスすることができる、任意の情報のブロック又は情報を格納するためのリソースです。

Ruby on Rails 6

Ruby on Rails 6は、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

Q&A

解決済

1回答

4020閲覧

NoMethodError: undefined method `email' for nil:NilClass が解決できない

outmysd

総合スコア3

CentOS

CentOSは、主にRed Hat Enterprise Linux(RHEL)をベースにした、フリーのソフトウェアオペレーティングシステムです。

Cloud9

Cloud9は、クラウドからのプログラミングが可能になるWebサービス。IDEとしての機能が搭載されており、GitHubやHerokuなど他ツールとの連携も可能です。ブラウザ上で動くため、デバイスに関係なく開発環境を準備できます。

ファイル

ファイルとは、文字列に基づいた名前又はパスからアクセスすることができる、任意の情報のブロック又は情報を格納するためのリソースです。

Ruby on Rails 6

Ruby on Rails 6は、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

0グッド

1クリップ

投稿2021/01/02 13:43

編集2021/01/03 06:30

#分からないこと
railsチュートリアル学習中です。14章のフォロー機能の実装が完了し、あとはgitや本番環境にpushすればチュートリアル完了というところまで来ています。
しかし、rails test 実行時のエラーが未だ解消できておりません。
emailが未定義とのことですがどこを調べたらよいのでしょうか?
サインアップの際に本来ならば認証メールのリンクからアカウントを有効化するはずなのですが、メールを送ると同時にログインできてしまっているので、認証に不備があるのではないかと思いました。

ERROR["test_layout_links_when_logged_in_user", #<Minitest::Reporters::Suite:0x000055972c237238 @name="SiteLayoutTest">, 2.308595962000254]  test_layout_links_when_logged_in_user#SiteLayoutTest (2.31s) NoMethodError:         NoMethodError: undefined method `email' for nil:NilClass             test/test_helper.rb:31:in `log_in_as'             test/integration/site_layout_test.rb:6:in `block in <class:SiteLayoutTest>'

#関連ファイル

#test/test_helper.rb ENV['RAILS_ENV'] ||= 'test' require_relative '../config/environment' require 'rails/test_help' require "minitest/reporters" Minitest::Reporters.use! class ActiveSupport::TestCase     # Run tests in parallel with specified workers   parallelize(workers: :number_of_processors)   # Setup all fixtures in test/fixtures/*.yml for all tests in alphabetical order.   fixtures :all   include ApplicationHelper   # Add more helper methods to be used by all tests here...     # テストユーザーがログイン中の場合にtrueを返す   def is_logged_in?     !session[:user_id].nil?   end   # テストユーザーとしてログインする   def log_in_as(user)     session[:user_id] = user.id   end end class ActionDispatch::IntegrationTest   # テストユーザーとしてログインする   def log_in_as(user, password: 'password', remember_me: '1')       post login_path, params: { session: { email: user.email,                                             password: password,                                             remember_me: remember_me } }   end end
#test/integration/site_layout_test.rb require 'test_helper' class SiteLayoutTest < ActionDispatch::IntegrationTest     test "layout links when logged in user" do     log_in_as(@user)     get root_path     assert_select "a[href=?]",  root_path, count: 2     assert_select "a[href=?]", help_path     assert_select "a[href=?]", about_path     assert_select 'a[href=?]', contact_path     assert_select "a[href=?]", users_path     assert_select 'a[href=?]', user_path(@user)     assert_select 'a[href=?]', edit_user_path(@user)     assert_select 'a[href=?]', logout_path     assert_match @user.active_relationships.count.to_s, response.body     assert_match @user.passive_relationships.count.to_s, response.body   end end
#index.html.erb <% provide(:title, 'All users') %> <h1>All users</h1> <%= will_paginate %> <ul class="users">   <%= render @users %>   </ul> <%= will_paginate %>
#schema.rb ActiveRecord::Schema.define(version: 2020_12_29_104035) do (略)   create_table "users", force: :cascade do |t|     t.string "name"     t.string "email"     t.datetime "created_at", precision: 6, null: false     t.datetime "updated_at", precision: 6, null: false     t.string "password_digest"     t.boolean "admin", default: false     t.string "remember_digest"     t.string "activation_digest"     t.boolean "activated", default: false     t.datetime "activated_at"     t.string "reset_digest"     t.datetime "reset_sent_at"     t.index ["email"], name: "index_users_on_email", unique: true   end   add_foreign_key "active_storage_attachments", "active_storage_blobs", column: "blob_id"   add_foreign_key "microposts", "users" end
#users_controller.rb class UsersController < ApplicationController   before_action :logged_in_user, only: [:index, :edit, :update, :destroy,                                         :following, :followers]   before_action :correct_user,   only: [:edit, :update]   before_action :admin_user,     only: :destroy     def index     @users = User.where(activated: true).paginate(page: params[:page])   end   def show     @user = User.find(params[:id])     redirect_to root_url and return unless @user.activated?     @microposts = @user.microposts.paginate(page: params[:page])   end   def new     @user = User.new   end   def create     @user = User.new(user_params)     if @user.save       @user.send_activation_email       flash[:info] = "Please check your email to activate your account."       redirect_to root_url     else       render 'new'     end   end   def edit     #@user = User.find(params[:id])   end   def update     #@user = User.find(params[:id])     if @user.update(user_params)       # 更新に成功した場合を扱う。       flash[:success] = "Profile updated"       redirect_to @user     else       render 'edit'     end   end     def destroy     User.find(params[:id]).destroy     flash[:success] = "User deleted"     redirect_to users_url   end   (略)   private     def user_params       params.require(:user).permit(:name, :email, :password,                                    :password_confirmation)     end         # beforeアクション         # 正しいユーザーかどうか確認     def correct_user       @user = User.find(params[:id])       redirect_to(root_url) unless current_user?(@user)     end         # 管理者かどうか確認     def admin_user       redirect_to(root_url) unless current_user.admin?     end end
#user.rb class User < ApplicationRecord   has_many :microposts, dependent: :destroy   has_many :active_relationships,  class_name:  "Relationship",                                    foreign_key: "follower_id",                                    dependent:   :destroy   has_many :passive_relationships, class_name:  "Relationship",                                    foreign_key: "followed_id",                                    dependent:   :destroy   has_many :following, through: :active_relationships,  source: :followed   has_many :followers, through: :passive_relationships, source: :follower   attr_accessor :remember_token, :activation_token, :reset_token   before_save { email.downcase! }   before_create :create_activation_digest   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: true   has_secure_password   validates :password, presence: true, length: { minimum: 6 }, allow_nil: true   (略)   private     # メールアドレスをすべて小文字にする     def downcase_email       self.email = email.downcase     end     # 有効化トークンとダイジェストを作成および代入する     def create_activation_digest       self.activation_token  = User.new_token       self.activation_digest = User.digest(activation_token)     end end

migrate

#20200523010738_create_users.rb class CreateUsers < ActiveRecord::Migration[6.0]   def change     create_table :users do |t|       t.string :name       t.string :email       t.timestamps     end   end end

#試したこと
db:migrate:reset
他にもエラーに関してググってみても、似たような質問は多かったのですがうまく応用できませんでした。
一番近い質問

#環境
CentOS

#gemfime source 'https://rubygems.org' git_source(:github) { |repo| "https://github.com/#{repo}.git" } gem 'rails',      '6.0.3' gem 'aws-sdk-s3',     '1.46.0', require: false gem 'image_processing', '1.9.3' gem 'mini_magick',      '4.9.5' gem 'active_storage_validations', '0.8.2' gem 'bcrypt',         '3.1.13' gem 'faker',          '2.1.2' gem 'will_paginate',           '3.1.8' gem 'bootstrap-will_paginate', '1.0.0' gem 'bootstrap-sass', '3.4.1' gem 'puma',       '4.3.6' gem 'sass-rails', '5.1.0' gem 'webpacker',  '4.0.7' gem 'turbolinks', '5.2.0' gem 'jbuilder',   '2.9.1' gem 'bootsnap',   '1.4.5', require: false group :development, :test do   gem 'sqlite3', '1.4.1'   gem 'byebug',  '11.0.1', platforms: [:mri, :mingw, :x64_mingw] end group :development do   gem 'web-console',           '4.0.1'   gem 'listen',                '3.1.5'   gem 'spring',                '2.1.0'   gem 'spring-watcher-listen', '2.0.1' end group :test do   gem 'capybara',                 '3.28.0'   gem 'selenium-webdriver',       '3.142.4'   gem 'webdrivers',               '4.1.2'   gem 'rails-controller-testing', '1.0.4'   gem 'minitest',                 '5.11.3'   gem 'minitest-reporters',       '1.3.8'   gem 'guard',                    '2.16.2'   gem 'guard-minitest',           '2.4.6' end group :production do   gem 'pg', '1.1.4' end # Windows ではタイムゾーン情報用の tzinfo-data gem を含める必要があります gem 'tzinfo-data', platforms: [:mingw, :mswin, :x64_mingw, :jruby]

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

NoMethodError: undefined method `email' for nil:NilClass

nilの変数には`email'メソッドは存在しない
という至極アタリマエのことを言ってます

.email がくっついてる変数がnilになってませんか?

投稿2021/01/02 21:11

y_waiwai

総合スコア88038

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

outmysd

2021/01/03 11:53

ご回答ありがとうございました。 どうしても分からなかったのでhttps://github.com/yasslab/sample_apps/blob/master/6_0_0/ch14/test/integration/site_layout_test.rb こちらで模範解答を確認したところ、site_layout_test.rbのlog_in_as(@user)がなかったので該当する部分を削除し、テストはGREENになりました。根本的な解決とは言えないので後日 復習しておきたいと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問