質問をすることでしか得られない、回答やアドバイスがある。

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

ただいまの
回答率

90.50%

  • Ruby

    9449questions

    Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

  • Ruby on Rails 5

    3196questions

ページネーションがブラウザでは機能しているのに、テストでpaginateメソッドが定義されていないと出てしまいググっても解決できません。

受付中

回答 0

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 467
退会済みユーザー

退会済みユーザー

Ruby on Railsチュートリアルをやっているプログラミング初心者です。
第10章の最後の統合テスト(リスト10.62)を走らせると以下のようにNoMethodErrorが出てしまい、検索しても解決できずに困っています。お力を貸して頂けませんでしょうか。
質問に際して足りない情報があればその点もコメントいただければと思います。

なお、開発環境や言語のバージョンは以下の通りです。

※今後、同様のエラーで困っている方のために、エラーが解決した場合は経緯や問題だった点も含めて判明したことをきちんと報告します(そうされてない方がそれなりにいたので念のため…)。

 エラーメッセージ

テストを実行すると以下のメッセージが出ます。 

Error:
UsersIndexTest#test_index_as_admin_including_pagination_and_delete_links:
NoMethodError: undefined method `paginate' for #<Class:0x0000559475423858>
    app/controllers/users_controller.rb:7:in `index'
    test/integration/users_index_test.rb:12:in `block in <class:UsersIndexTest>'

users_controllerのindexアクションで、paginateメソッドが定義されておらず、エラーが出ているのだと思いますが、コードはチュートリアルの通りに書いており、'will_paginate'のGemも問題なくインストールされているはずです(実際に、ブラウザ上ではページネーションは表示&動作しています)。

<ブラウザでの表示>

イメージ説明

 該当のソースコード

#users_controller.rbのコード

  def index
    @users = User.paginate(page: params[:page])   #<=7行目
  end
#test/integration/users_index_test.rbのコード

  test "index as admin including pagination and delete links" do
    log_in_as(@admin)
    get users_path    #<=12行目
    assert_template 'users/index'
    assert_select 'div.pagination'
    first_page_of_users = User.paginate(page: 1)
    first_page_of_users.each do |user|
      assert_select 'a[href=?]', user_path(user), text: user.name
      unless user == @admin
        assert_select 'a[href=?]', user_path(user), text: 'delete'
      end
    end
    assert_difference 'User.count', -1 do
      delete user_path(@non_admin)
    end
  end
#Gemfile

gem 'will_paginate',           '3.1.6'
gem 'bootstrap-will_paginate', '1.0.0'

 試したこと

ブラウザではきちんと動作しているのに、テストに失敗している事例を見つけられず、何をすれば解決するのかが分からない状態です…

 補足情報

以下は、参考までにエラーのログや関連ファイルの全コードです。

Error:
UsersIndexTest#test_index_as_admin_including_pagination_and_delete_links:
NoMethodError: undefined method `paginate' for #<Class:0x0000559475423858>
    app/controllers/users_controller.rb:7:in `index'
    test/integration/users_index_test.rb:12:in `block in <class:UsersIndexTest>'


/home/vagrant/.rbenv/versions/2.4.2/lib/ruby/gems/2.4.0/gems/railties-5.1.4/lib/rails/test_unit/reporter.rb:70:in `method': undefined method `test_index_as_admin_including_pagination_and_delete_links' for class `Minitest::Result' (NameError)
    from /home/vagrant/.rbenv/versions/2.4.2/lib/ruby/gems/2.4.0/gems/railties-5.1.4/lib/rails/test_unit/reporter.rb:70:in `format_rerun_snippet'
    from /home/vagrant/.rbenv/versions/2.4.2/lib/ruby/gems/2.4.0/gems/railties-5.1.4/lib/rails/test_unit/reporter.rb:23:in `record'
    from /home/vagrant/.rbenv/versions/2.4.2/lib/ruby/gems/2.4.0/gems/minitest-5.11.3/lib/minitest.rb:803:in `block in record'
    from /home/vagrant/.rbenv/versions/2.4.2/lib/ruby/gems/2.4.0/gems/minitest-5.11.3/lib/minitest.rb:802:in `each'
    from /home/vagrant/.rbenv/versions/2.4.2/lib/ruby/gems/2.4.0/gems/minitest-5.11.3/lib/minitest.rb:802:in `record'
    from /home/vagrant/.rbenv/versions/2.4.2/lib/ruby/gems/2.4.0/gems/minitest-5.11.3/lib/minitest.rb:334:in `run_one_method'
    from /home/vagrant/.rbenv/versions/2.4.2/lib/ruby/gems/2.4.0/gems/minitest-5.11.3/lib/minitest.rb:321:in `block (2 levels) in run'
    from /home/vagrant/.rbenv/versions/2.4.2/lib/ruby/gems/2.4.0/gems/minitest-5.11.3/lib/minitest.rb:320:in `each'
    from /home/vagrant/.rbenv/versions/2.4.2/lib/ruby/gems/2.4.0/gems/minitest-5.11.3/lib/minitest.rb:320:in `block in run'
    from /home/vagrant/.rbenv/versions/2.4.2/lib/ruby/gems/2.4.0/gems/minitest-5.11.3/lib/minitest.rb:360:in `on_signal'
    from /home/vagrant/.rbenv/versions/2.4.2/lib/ruby/gems/2.4.0/gems/minitest-5.11.3/lib/minitest.rb:347:in `with_info_handler'
    from /home/vagrant/.rbenv/versions/2.4.2/lib/ruby/gems/2.4.0/gems/minitest-5.11.3/lib/minitest.rb:319:in `run'
    from /home/vagrant/.rbenv/versions/2.4.2/lib/ruby/gems/2.4.0/gems/railties-5.1.4/lib/rails/test_unit/line_filtering.rb:9:in `run'
    from /home/vagrant/.rbenv/versions/2.4.2/lib/ruby/gems/2.4.0/gems/minitest-5.11.3/lib/minitest.rb:159:in `block in __run'
    from /home/vagrant/.rbenv/versions/2.4.2/lib/ruby/gems/2.4.0/gems/minitest-5.11.3/lib/minitest.rb:159:in `map'
    from /home/vagrant/.rbenv/versions/2.4.2/lib/ruby/gems/2.4.0/gems/minitest-5.11.3/lib/minitest.rb:159:in `__run'
    from /home/vagrant/.rbenv/versions/2.4.2/lib/ruby/gems/2.4.0/gems/minitest-5.11.3/lib/minitest.rb:136:in `run'
    from /home/vagrant/.rbenv/versions/2.4.2/lib/ruby/gems/2.4.0/gems/minitest-5.11.3/lib/minitest.rb:63:in `block in autorun'
    from /home/vagrant/.rbenv/versions/2.4.2/lib/ruby/gems/2.4.0/gems/spring-2.0.2/lib/spring/application.rb:171:in `fork'
    from /home/vagrant/.rbenv/versions/2.4.2/lib/ruby/gems/2.4.0/gems/spring-2.0.2/lib/spring/application.rb:171:in `serve'
    from /home/vagrant/.rbenv/versions/2.4.2/lib/ruby/gems/2.4.0/gems/spring-2.0.2/lib/spring/application.rb:141:in `block in run'
    from /home/vagrant/.rbenv/versions/2.4.2/lib/ruby/gems/2.4.0/gems/spring-2.0.2/lib/spring/application.rb:135:in `loop'
    from /home/vagrant/.rbenv/versions/2.4.2/lib/ruby/gems/2.4.0/gems/spring-2.0.2/lib/spring/application.rb:135:in `run'
    from /home/vagrant/.rbenv/versions/2.4.2/lib/ruby/gems/2.4.0/gems/spring-2.0.2/lib/spring/application/boot.rb:19:in `<top (required)>'
    from /home/vagrant/.rbenv/versions/2.4.2/lib/ruby/2.4.0/rubygems/core_ext/kernel_require.rb:55:in `require'
    from /home/vagrant/.rbenv/versions/2.4.2/lib/ruby/2.4.0/rubygems/core_ext/kernel_require.rb:55:in `require'
    from -e:1:in `<main>'
#test/integration/users_index_test.rbのコード

require 'test_helper'

class UsersIndexTest < ActionDispatch::IntegrationTest

  def setup
    @admin     = users(:michael)
    @non_admin = users(:archer)
  end

  test "index as admin including pagination and delete links" do
    log_in_as(@admin)
    get users_path
    assert_template 'users/index'
    assert_select 'div.pagination'
    first_page_of_users = User.paginate(page: 1)
    first_page_of_users.each do |user|
      assert_select 'a[href=?]', user_path(user), text: user.name
      unless user == @admin
        assert_select 'a[href=?]', user_path(user), text: 'delete'
      end
    end
    assert_difference 'User.count', -1 do
      delete user_path(@non_admin)
    end
  end

  test "index as non-admin" do
    log_in_as(@non_admin)
    get users_path
    assert_select 'a', text: 'delete', count: 0
  end
end
#users_controller.rbのコード

class UsersController < ApplicationController
  before_action :logged_in_user, only: [:index, :edit, :update, :destroy]
  before_action :correct_user,   only: [:edit, :update]
  before_action :admin_user,     only: :destroy

  def index
    @users = User.paginate(page: params[:page])
  end

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

  def new
    @user = User.new
  end

  def create
    @user = User.new(user_params)
    if @user.save
      log_in @user
      flash[:success] = "Welcome to Progmate!"
      redirect_to @user
    else
      render 'new'
    end
  end

  def edit
    @user = User.find(params[:id])
  end

  def update
    @user = User.find(params[:id])
    if @user.update_attributes(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 action

    #ログイン済みのユーザーかどうか確認
    def logged_in_user
      unless logged_in?
        store_location
        flash[:danger] = "Please log in."
        redirect_to login_url
      end
    end

    #正しいユーザーかどうか確認
    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
#Gemfile

source 'https://rubygems.org'

gem 'rails',        '5.1.4'
gem 'bcrypt',         '3.1.11'
gem 'faker',          '1.7.3'
gem 'will_paginate',           '3.1.6'
gem 'bootstrap-will_paginate', '1.0.0'
gem 'bootstrap-sass', '3.3.7'
gem 'puma',         '3.9.1'
gem 'sass-rails',   '5.0.6'
gem 'uglifier',     '3.2.0'
gem 'coffee-rails', '4.2.2'
gem 'jquery-rails', '4.3.1'
gem 'turbolinks',   '5.0.1'
gem 'jbuilder',     '2.7.0'

group :development, :test do
  gem 'sqlite3', '1.3.13'
  gem 'byebug',  '9.0.6', platform: :mri
end

group :development do
  gem 'web-console',           '3.5.1'
  gem 'listen',                '3.1.5'
  gem 'spring',                '2.0.2'
  gem 'spring-watcher-listen', '2.0.1'
end

group :test do
  gem 'rails-controller-testing', '1.0.2'
  gem 'minitest-reporters',       '1.1.14'
  gem 'guard',                    '2.13.0'
  gem 'guard-minitest',           '2.4.4'
end

group :production do
  gem 'pg', '0.18.4'
end
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

まだ回答がついていません

同じタグがついた質問を見る

  • Ruby

    9449questions

    Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

  • Ruby on Rails 5

    3196questions

  • トップ
  • Rubyに関する質問
  • ページネーションがブラウザでは機能しているのに、テストでpaginateメソッドが定義されていないと出てしまいググっても解決できません。