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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Ruby

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

Ruby on Rails

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

Q&A

解決済

1回答

627閲覧

Rails tutorialでテストのエラーが発生し解決したが、理由が分からない

kenkato

総合スコア7

Ruby

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

Ruby on Rails

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

0グッド

1クリップ

投稿2017/10/03 09:15

###Ruby on Rails チュートリアルで発生したエラーの理由が分からない
現在10.2.3 フレンドリーフォワーディングの実装をしています。
昨日、上記機能を実装し、テストを行ったところエラーが発生し解決できなかったのですが、本日再度同じテストを行ったところ問題なく通りました。

初めは、users_controllerから別コントローラのヘルパー(sessions_helperなど)のメソッドを呼ぶ時にはincludeなどで明示的に記述する必要があるのかななどと考えて試行錯誤していたのですが、翌日(本日)テストをするとあっさり通ってしまいました。

私の考えられる原因としては、多分ないと思いますがファイル保存のし忘れか、Cloud9で開発していたことに何か関係があるのかな(サーバー等関係ある?)と思っているのですが、今となっては検証のしようもないので、原因の推測ができると嬉しいです。

###エラーメッセージ

~/workspace/sample_app (updating-users) $ rails test Running via Spring preloader in process 26498 Started with run options --seed 25040 ERROR["test_should_redirect_edit_when_not_logged_in", UsersControllerTest, 0.49104784801602364] test_should_redirect_edit_when_not_logged_in#UsersControllerTest (0.49s) NameError: NameError: undefined local variable or method ` store_location' for #<UsersController:0x00000005b92670> Did you mean? store_location app/controllers/users_controller.rb:51:in `logged_in_user' test/controllers/users_controller_test.rb:16:in `block in <class:UsersControllerTest>' ERROR["test_should_redirect_update_when_not_logged_in", UsersControllerTest, 0.7571796495467424] test_should_redirect_update_when_not_logged_in#UsersControllerTest (0.76s) NameError: NameError: undefined local variable or method ` store_location' for #<UsersController:0x000000074afbd0> Did you mean? store_location app/controllers/users_controller.rb:51:in `logged_in_user' test/controllers/users_controller_test.rb:22:in `block in <class:UsersControllerTest>' ERROR["test_successful_edit_with_friendly_forwarding", UsersEditTest, 1.046991671435535] test_successful_edit_with_friendly_forwarding#UsersEditTest (1.05s) NameError: NameError: undefined local variable or method ` store_location' for #<UsersController:0x00000007a3cfd0> Did you mean? store_location app/controllers/users_controller.rb:51:in `logged_in_user' test/integration/users_edit_test.rb:22:in `block in <class:UsersEditTest>' 35/35: [==========================] 100% Time: 00:00:01, Time: 00:00:01 Finished in 1.09893s 35 tests, 79 assertions, 0 failures, 3 errors, 0 skips

###試したこと

store_locationの定義がなされていないとエラーに書かれていたので、実装していたコントローラーの方でstore_locationメソッドをコメントアウトすると下記エラーが出るところまで確認していました。

FAIL["test_successful_edit_with_friendly_forwarding", UsersEditTest, 0.8020298359915614] test_successful_edit_with_friendly_forwarding#UsersEditTest (0.80s) Expected response to be a redirect to <http://www.example.com/users/762146111/edit> but was a redirect to <http://www.exaers/762146111/edit" to be === "http://www.example.com/users/762146111". test/integration/users_edit_test.rb:24:in `block in <class:UsersEditTest>' 35/35: [==============================================] 100% Time: 00:00:01, Time: 00:00:01Finished in 1.05402s 35 tests, 85 assertions, 1 failures, 0 errors, 0 skips

###補足情報(言語/FW/ツール等のバージョンなど)
Ruby 2.4.0p0 (2016-12-24 revision 57164) [x86_64-linux]
Rails 5.1.2
エディタ Cloud9

###該当のソースコード
コードは最終的にチュートリアルのものをコピペしたので問題ないかと思います。
念のため参考用に関係のありそうなコードを記載しています。

ruby

1module SessionsHelper 2 . 3 . 4 . 5 # 記憶したURL (もしくはデフォルト値) にリダイレクト 6 def redirect_back_or(default) 7 redirect_to(session[:forwarding_url] || default) 8 session.delete(:forwarding_url) 9 end 10 11 # アクセスしようとしたURLを覚えておく 12 def store_location 13 session[:forwarding_url] = request.original_url if request.get? 14 end 15end

ruby

1class UsersController < ApplicationController 2 before_action :logged_in_user, only: [:edit, :update] 3 before_action :correct_user, only: [:edit, :update] 4 . 5 . 6 . 7 private 8 9 def user_params 10 params.require(:user).permit(:name, :email, :password, 11 :password_confirmation) 12 end 13 14 # beforeアクション 15 16 # ログイン済みユーザーかどうか確認 17 def logged_in_user 18 unless logged_in? 19 store_location #ここの行をコメントアウトして検証 20 flash[:danger] = "Please log in." 21 redirect_to login_url 22 end 23 end 24 25 # 正しいユーザーかどうか確認 26 def correct_user 27 @user = User.find(params[:id]) 28 redirect_to(root_url) unless current_user?(@user) 29 end 30end

ruby

1require 'test_helper' 2 3class UsersEditTest < ActionDispatch::IntegrationTest 4 5 def setup 6 @user = users(:michael) 7 end 8 . 9 . 10 . 11 test "successful edit with friendly forwarding" do 12 get edit_user_path(@user) 13 log_in_as(@user) 14 assert_redirected_to edit_user_url(@user) 15 name = "Foo Bar" 16 email = "foo@bar.com" 17 patch user_path(@user), params: { user: { name: name, 18 email: email, 19 password: "", 20 password_confirmation: "" } } 21 assert_not flash.empty? 22 assert_redirected_to @user 23 @user.reload 24 assert_equal name, @user.name 25 assert_equal email, @user.email 26 end 27end

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

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

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

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

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

guest

回答1

0

ベストアンサー

undefined local variable or method ` store_location'

上のエラーメッセージで、引用符とstoreの間が空いていますが、ここにあるのは全角スペースです。Rubyでは、全角スペースもメソッド名に使えるので、そういうメソッド名だと認識されてエラーとなっています。

エディタの設定やフォントなどで、全角スペースを見えるようにできますので、設定しておくと不用意な混入が防げます。

投稿2017/10/03 12:38

maisumakun

総合スコア145183

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

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

kenkato

2017/10/04 05:01

なるほど! 的確な回答と、今後の予防策まで提案していただいてありがとうございます!
maisumakun

2017/10/04 06:17

けっこう「やらかしがち」なうえに、普通の設定だと見えないのでなかなかわからず、ハマりやすいところです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問