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

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

ただいまの
回答率

88.59%

Rails チュートリアル 10.3.3 user.ymlでのエラー

受付中

回答 1

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 533

asbelft

score 4

前提・実現したいこと

Rails tutorial 10章 10.3.3 にてエラーが発生しました。
リスト10.48 ページネーションを含めたUserIndexのテストにて、
以前までパスできていたテストがパスしなくなりました。

User.ymlを編集後にエラーが発生するようになったので、原因はUser.ymlの可能性が高いとみております。

発生している問題・エラーメッセージ

FAIL["test_successful_edit_with_friendly_forwarding", UsersEditTest, 0.8996056399992085]
 test_successful_edit_with_friendly_forwarding#UsersEditTest (0.90s)
        Expected response to be a redirect to <http://www.example.com/users/762146111> but was a redirect to <http://www.example.com/>.
        Expected "http://www.example.com/users/762146111" to be === "http://www.example.com/".
        test/integration/users_edit_test.rb:32:in `block in <class:UsersEditTest>'

FAIL["test_unsuccessful_edit", UsersEditTest, 0.9178885359997366]
 test_unsuccessful_edit#UsersEditTest (0.92s)
        expecting <"users/edit"> but rendering with <[]>
        test/integration/users_edit_test.rb:12:in `block in <class:UsersEditTest>'

該当のソースコード

require 'test_helper'

class UsersEditTest < ActionDispatch::IntegrationTest

  def setup
    @user = users(:michael)
  end


  test "unsuccessful edit" do
    log_in_as(@user)
    get edit_user_path(@user)
    **assert_template 'users/edit'** #ここでエラー
    patch user_path(@user),params:{user:{name:"",
                                    email:"foo@invalid",
                                    password: "foo",
                                    password_confirmation: "bar"}}
    assert_template 'users/edit'
    assert_select "div.alert",count:1
  end

  test "successful edit with friendly forwarding" do
    get edit_user_path(@user)
    log_in_as(@user)
    assert_redirected_to edit_user_url(@user)
    name = "Foo Bar"
    email = "foo@bar.com"
    patch user_path(@user),params:{user:{name:name,
                                        email:email,
                                        password: "",
                                        password_confirmation: ""}}
    assert_not flash.empty?
    **assert_redirected_to @user** #ここでエラー
    @user.reload
    assert_equal name,@user.name
    assert_equal email,@user.email
  end 

end
users.yml

michael:
  name: Michael Example
  email: michael@example.com
  password_digest: <%= User.digest('password') %>
  admin: true
  activated: true
  activated_at: <%= Time.zone.now %>

archer:
  name: Sterling Archer
  email: duchess@example.gov
  password_digest: <%= User.digest('password') %>
  activated: true
  activated_at: <%= Time.zone.now %>

lana:
  name: Lana Kane
  email: hands@example.gov
  password_digest: <%= User.digest('password') %>
  activated: true
  activated_at: <%= Time.zone.now %>

malory:
  name: Malory Archer
  email: boss@example.gov
  password_digest: <%= User.digest('password') %>
  activated: true
  activated_at: <%= Time.zone.now %>

<% 30.times do |n| %>
user_<%= n %>:
  name:  <%= "User #{n}" %>
  email: <%= "user-#{n}@example.com" %>
  password_digest: <%= User.digest('password') %>
  activated: true
  activated_at: <%= Time.zone.now %>
<% end %>

試したこと

エラーはusers.ymlを編集した後から発生しているので、複数パターンを試しました。
users.ymlにmichaelとarcherしかない場合は以前までのテストはパスしました。

<% 30.times do |n| %>
user_<%= n %>:
  name:  <%= "User #{n}" %>
  email: <%= "user-#{n}@example.com" %>
  password_digest: <%= User.digest('password') %>
<% end %>

のコードを加えると今回のエラーメッセージが表示されるようになりました。

lana:
  name: Lana Kane
  email: hands@example.gov
  password_digest: <%= User.digest('password') %>

malory:
  name: Malory Archer
  email: boss@example.gov
  password_digest: <%= User.digest('password') %>

だけをmichaelとarcherの後に追加しても同様のエラーが発生致します。

かなりの時間このエラーと格闘しておりますが、解決せず…

以下が、log/test.logとなります。

UsersEditTest: test_successful_edit_with_friendly_forwarding
------------------------------------------------------------
  User Load (0.1ms)  SELECT  "users".* FROM "users" WHERE "users"."id" = ? LIMIT ?  [["id", 762146111], ["LIMIT", 1]]
Started GET "/users/762146111/edit" for 127.0.0.1 at 2019-10-14 07:11:42 +0000
Processing by UsersController#edit as HTML
  Parameters: {"id"=>"762146111"}
Redirected to http://www.example.com/login
Filter chain halted as :logged_in_user rendered or redirected
Completed 302 Found in 0ms (ActiveRecord: 0.0ms)
Started POST "/login" for 127.0.0.1 at 2019-10-14 07:11:42 +0000
Processing by SessionsController#create as HTML
  Parameters: {"session"=>{"email"=>"michael@example.com", "password"=>"[FILTERED]", "remember_me"=>"1"}}
  User Load (0.1ms)  SELECT  "users".* FROM "users" WHERE "users"."email" = ? LIMIT ?  [["email", "michael@example.com"], ["LIMIT", 1]]
   (0.1ms)  SAVEPOINT active_record_1
  SQL (0.7ms)  UPDATE "users" SET "remember_digest" = ?, "updated_at" = ? WHERE "users"."id" = ?  [["remember_digest", "$2a$04$juX6Kq62d8GXIB/UwY6sWuY/h8/S7PPNhuIYM7VhMyc1P/58cVrfq"], ["updated_at", "2019-10-14 07:11:42.396379"], ["id", 762146111]]
   (0.1ms)  RELEASE SAVEPOINT active_record_1
Redirected to http://www.example.com/users/762146111/edit
Completed 302 Found in 6ms (ActiveRecord: 0.9ms)
Started PATCH "/users/762146111" for 127.0.0.1 at 2019-10-14 07:11:42 +0000
Processing by UsersController#update as HTML
  Parameters: {"user"=>{"name"=>"Foo Bar", "email"=>"foo@bar.com", "password"=>"[FILTERED]", "password_confirmation"=>"[FILTERED]"}, "id"=>"762146111"}
  User Load (0.1ms)  SELECT  "users".* FROM "users" WHERE "users"."id" = ? LIMIT ?  [["id", 762146111], ["LIMIT", 1]]
  User Load (0.1ms)  SELECT  "users".* FROM "users" WHERE (762146111) LIMIT ?  [["LIMIT", 1]]
Redirected to http://www.example.com/
Filter chain halted as :correct_user rendered or redirected
Completed 302 Found in 2ms (ActiveRecord: 0.2ms)
   (1.1ms)  rollback transaction
   (0.0ms)  begin transaction
-------------------------------------
UsersEditTest: test_unsuccessful_edit
-------------------------------------
  User Load (0.1ms)  SELECT  "users".* FROM "users" WHERE "users"."id" = ? LIMIT ?  [["id", 762146111], ["LIMIT", 1]]
Started POST "/login" for 127.0.0.1 at 2019-10-14 07:11:42 +0000
Processing by SessionsController#create as HTML
  Parameters: {"session"=>{"email"=>"michael@example.com", "password"=>"[FILTERED]", "remember_me"=>"1"}}
  User Load (0.1ms)  SELECT  "users".* FROM "users" WHERE "users"."email" = ? LIMIT ?  [["email", "michael@example.com"], ["LIMIT", 1]]
   (0.1ms)  SAVEPOINT active_record_1
  SQL (0.7ms)  UPDATE "users" SET "remember_digest" = ?, "updated_at" = ? WHERE "users"."id" = ?  [["remember_digest", "$2a$04$r1N4U0sSl5psnpSZYHEK/Oou4UtteAodY.tYAsJGVLl07e8qaEqKa"], ["updated_at", "2019-10-14 07:11:42.420147"], ["id", 762146111]]
   (0.1ms)  RELEASE SAVEPOINT active_record_1
Redirected to http://www.example.com/users/762146111
Completed 302 Found in 8ms (ActiveRecord: 0.9ms)
Started GET "/users/762146111/edit" for 127.0.0.1 at 2019-10-14 07:11:42 +0000
Processing by UsersController#edit as HTML
  Parameters: {"id"=>"762146111"}
  User Load (0.1ms)  SELECT  "users".* FROM "users" WHERE "users"."id" = ? LIMIT ?  [["id", 762146111], ["LIMIT", 1]]
  User Load (0.9ms)  SELECT  "users".* FROM "users" WHERE (762146111) LIMIT ?  [["LIMIT", 1]]
Redirected to http://www.example.com/
Filter chain halted as :correct_user rendered or redirected
Completed 302 Found in 3ms (ActiveRecord: 1.0ms)
   (1.1ms)  rollback transaction
   (0.0ms)  begin transaction

補足情報(FW/ツールのバージョンなど)

AWS Cloud9

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

質問への追記・修正、ベストアンサー選択の依頼

  • asbelft

    2019/10/14 16:22

    エラー内容を追記しました。ymlのインテンドもエラー発生時と同様にしてあります。
    log/test.logも該当テストの部分を記載いたしました。
    大変恐縮ですが、ご指導のほどよろしくお願いいたします。

    キャンセル

  • winterboum

    2019/10/14 18:44

    情報ありがとうございます。
    眺めてみたのですが、私が考えていたのとは違うようで、すぐには原因掴めそうにないです。ごめんなさい

    キャンセル

  • asbelft

    2019/10/14 20:38

    お時間を割いていただきありがとうございます。
    自分でもテストの状況を実際に試してみたのですが、エラーにあるような症状が出なかったんですよね…。
    問題なく動作しているので戸惑っております。

    キャンセル

回答 1

0

こんにちは。
winterboumさんとのやりとりがあるので、こちらにコメントは恐縮ですが、思いつくところを添えてみますね。解決ずみでしたら、ご容赦を。

ログの確認

test.logに、Filter chain halted as :correct_user rendered or redirected というメッセージが出ています。

correct_userは、before_actionでedit / updateの実際の処理が走る前に呼ばれるメソッドですよね。
(https://railstutorial.jp/chapters/updating_and_deleting_users?version=5.1#code-correct_user_before_filter_boolean)

内容を見る限りでは、「正しいユーザじゃないと判定されたので、root_pathに飛ばす」という動きになっています。
ここまではご自身でも把握されているようでしたら、失礼しました。

その上で気になったのは、ログの/users/762146111 というリクエストです。

ユーザIDが762146111という状況なので、ずいぶんたくさん発行された状態でしょうか。
ここが少し気になりました。

もしよかったら、

  1. RAILS_ENV=test (テスト用)のDBをリセットする
  2. チュートリアルのソースコードを確認してみる

あたり、注意してみるといいのではと思います。

DBのリセット

rake db:migrate:reset RAILS_ENV=test
rake db:migrate RAILS_ENV=test

チュートリアルのソースコード

チュートリアルのサイトを運営しているyasslab様で、各章が終わった段階でのソースコードを公開しています。

https://github.com/yasslab/sample_apps

10章ならこのあたりなので、たとえばコントローラやセッション用のヘルパーのあたりを確認してみるといいのでは。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 88.59%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

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