LoginSignup
5
4

More than 5 years have passed since last update.

Ruby on Railsチュートリアル十章で起こったNoMethodErrorとその解決

Last updated at Posted at 2015-08-05

状況

Ruby on Railsチュートリアル第二版(ver4.0用)を、頭からほぼ手順通りに進めていたところ、10章で通るはずのテストが通らない問題が発生。

リスト10.13で

app/models/user.rb
class User < ActiveRecord::Base
  has_many :microposts, dependent: :destroy
    #中略
end

とモデルUserのレコードが消去されたときに関連するモデルMicropostのレコードを一緒に消去するコードを挿入し

リスト10.12のテスト

spec/models/user_spec.rb
require 'spec_helper'

describe User do

  #中略

  describe "micropost associations" do

    before { @user.save }
    let!(:older_micropost) do
      FactoryGirl.create(:micropost, user: @user, created_at: 1.day.ago)
    end
    let!(:newer_micropost) do
      FactoryGirl.create(:micropost, user: @user, created_at: 1.hour.ago)
    end

    #中略

    it "should destroy associated microposts" do
      microposts = @user.microposts.to_a
      @user.destroy
      expect(microposts).not_to be_empty
      microposts.each do |micropost|
        expect(Micropost.where(id: micropost.id)).to be_empty
      end
    end
  end
end

このテストを実行したところ以下のようなエラーが発生。

Failures:

  1) User micropost associations should destroy associated microposts
     Failure/Error: @user.destroy
     NoMethodError:
       undefined method `name' for nil:NilClass
     # ./spec/models/user_spec.rb:133:in `block (3 levels) in <top (required)>'

Finished in 4.82 seconds

88 examples, 1 failure



Failed examples:

コンソールからレコードの削除を試行錯誤をしてみたところ
リスト10.13のところで追記した
dependent: :destroy
ってところで詰まってる模様。

とりあえず解決

んで、いろいろ調べた結果このStackOverflowのページに辿り着いた。

どうもRailsチュートリアルで指定されたRails4.0.5に含まれるActiveRecodeのバグらしい。

GemfileでRailsのバージョン指定を
gem 'rails' '4.1.2'
書き換えて、
ターミナルから
bundle update rails
とRailsをアップデートしたのち
bundle exec rspec spec/
とテストを実行したら無事成功しました。

5
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
4