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

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

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

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

Ruby

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

Ruby on Rails

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

解決済

Railsで発生した「undefined local variable or method」エラーを直したいです。

sugisakisaki
sugisakisaki

総合スコア15

Ruby on Rails 5

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

Ruby

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

Ruby on Rails

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

1回答

2グッド

2クリップ

48007閲覧

投稿2019/01/15 10:30

編集2019/01/15 11:30

前提・実現したいこと

該当箇所とされるファイルを一通り確認しても問題箇所が見つからず、困っています。
rails初心者です。

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

Railsチュートリアル10章のリスト10.26より、
rails testを走らせた時に10errorが発生しました。

(直近テスト リスト10.22はエラー無し)

Ruby

1 1) Error: 2UsersEditTest#test_successful_edit: 3NoMethodError: undefined method `logged_in_user' for #<UsersController:0x007fa114dbe2e8> 4Did you mean? logged_in? 5 test/integration/users_edit_test.rb:25:in `block in <class:UsersEditTest>' 6 7 2) Error: 8UsersEditTest#test_unsuccessful_edit: 9NoMethodError: undefined method `logged_in_user' for #<UsersController:0x007fa114d6cfd8> 10Did you mean? logged_in? 11 test/integration/users_edit_test.rb:12:in `block in <class:UsersEditTest>' 12 13 3) Error: 14UsersControllerTest#test_should_redirect_edit_when_logged_in_as_wrong_user: 15NoMethodError: undefined method `logged_in_user' for #<UsersController:0x00000006b5e658> 16Did you mean? logged_in? 17 test/controllers/users_controller_test.rb:33:in `block in <class:UsersControllerTest>' 18 19 4) Error: 20UsersControllerTest#test_should_redirect_update_when_logged_in_as_wrong_user: 21AbstractController::ActionNotFound: The action 'update' could not be found for UsersController 22 test/controllers/users_controller_test.rb:40:in `block in <class:UsersControllerTest>' 23 24 5) Error: 25UsersControllerTest#test_should_get_new: 26ActionView::Template::Error: First argument in form cannot contain nil or be empty 27 app/views/users/new.html.erb:5:in `_app_views_users_new_html_erb__4200017072968446905_56780960' 28 test/controllers/users_controller_test.rb:11:in `block in <class:UsersControllerTest>' 29 30 8) Error: 31UsersLoginTest#test_login_with_valid_information_followed_by_: 32ActionView::Template::Error: undefined method `name' for nil:NilClass 33 app/views/users/show.html.erb:1:in `_app_views_users_show_html_erb__1377065752919381560_58665040' 34 test/integration/users_login_test.rb:24:in `block in <class:UsersLoginTest>' 35 36 9) Error: 37UsersSignupTest#test_valid_signup_information: 38ActionView::Template::Error: First argument in form cannot contain nil or be empty 39 app/views/users/new.html.erb:5:in `_app_views_users_new_html_erb__4200017072968446905_56780960' 40 test/integration/users_signup_test.rb:16:in `block in <class:UsersSignupTest>' 41 4232 runs, 47 assertions, 0 failures, 10 errors, 0 skips

(字数制限により同じファイルからのエラーは一部省略してます)

該当のソースコード

テスト(10章で実装したもの)

①UsersEditTest

Ruby

1require 'test_helper' 2 3class UsersEditTest < ActionDispatch::IntegrationTest 4 5 def setup 6 @user = users(:michael) 7 end 8 9 # 失敗時 10 test "unsuccessful edit" do 11 log_in_as(@user) 12 get edit_user_path(@user) 13 assert_template 'users/edit' 14 patch user_path(@user), params: { user: { name: "", 15 email: "foo@invalid", 16 password: "foo", 17 password_confirmation: "bar" } } 18 19 assert_template 'users/edit' 20 end 21 22 # 成功時 23 test "successful edit" do 24 log_in_as(@user) 25 get edit_user_path(@user) 26 assert_template 'users/edit' 27 name = "Foo Bar" 28 email = "foo@bar.com" 29 patch user_path(@user), params: { user: { name: name, 30 email: email, 31 password: "", 32 password_confirmation: "" } } 33 assert_not flash.empty? 34 assert_redirected_to @user 35 @user.reload 36 assert_equal name, @user.name 37 assert_equal email, @user.email 38 end 39end

②UsersControllerTest

Ruby

1require 'test_helper' 2 3class UsersControllerTest < ActionDispatch::IntegrationTest 4 5 def setup 6 @user = users(:michael) 7 @other_user = users(:archer) 8 end 9 10 test "should get new" do 11 get signup_path 12 assert_response :success 13 end 14 15 test "should redirect edit when not logged in" do 16 get edit_user_path(@user) 17 assert_not flash.empty? 18 assert_redirected_to login_url 19 end 20 21 test "should redirect update when not logged in" do 22 patch user_path(@user), params: { user: { name: @user.name, 23 email: @user.email } } 24 assert_not flash.empty? 25 assert_redirected_to login_url 26 end 27 28 29 # 他人が入った場合の失敗テスト 30 31 test "should redirect edit when logged in as wrong user" do 32 log_in_as(@other_user) # 例 archerさんが入った場合 33 get edit_user_path(@user) 34 assert flash.empty? 35 assert_redirected_to root_url 36 end 37 38 test "should redirect update when logged in as wrong user" do 39 log_in_as(@other_user) # 例 archerさんが入った場合 40 patch user_path(@user), params: { user: { name: @user.name, 41 email: @user.email } } 42 assert flash.empty? 43 assert_redirected_to root_url 44 end 45 46end

(③test_helper.rb)

Ruby

1ENV['RAILS_ENV'] ||= 'test' 2require File.expand_path('../../config/environment', __FILE__) 3require 'rails/test_help' 4 5class ActiveSupport::TestCase 6 # Setup all fixtures in test/fixtures/*.yml for all tests in alphabetical order. 7 fixtures :all 8 9 # テストユーザーがログイン中の場合にtrueを返す 10 def is_logged_in? 11 !session[:user_id].nil? 12 end 13 14 # テストユーザーとしてログインする 15 def log_in_as(user) 16 session[:user_id] = user.id 17 end 18end 19 20 class ActionDispatch::IntegrationTest 21 22 # テストユーザーとしてログインする 23 def log_in_as(user, password: 'password', remember_me: '1') 24 post login_path, params: { session: { email: user.email, 25 password: password, 26 remember_me: remember_me } } 27 end 28end 29

###ファイル(10章で実装したもの)

①UsersController

Ruby

1class UsersController < ApplicationController 2 before_action :logged_in_user, only: [:edit, :update] 3 before_action :correct_user, only: [:edit, :update] 4 # 上から順に行う 5 6 def show 7 @user = User.find(params[:id]) 8 end 9 10 def new 11 @user = User.new 12 end 13 14 def create 15 @user = User.new(user_params) 16 if @user.save 17 log_in @user 18 flash[:success] = "Welcome to the Sample App!" 19 redirect_to @user 20 # GET => redirect_to "/user/#{@user.id}" => show 21 else 22 render "new" 23 end 24 end 25 26 def edit 27 @user = User.find(params[:id]) 28 end 29 30 def update 31 @user = User.find(params[:id]) 32 if @user.update_attributes(user_params) #下のバリデーション 33 # Success 34 flash[:success] = "Profile updated" 35 redirect_to @user 36 else 37 # Failure 38 # => @user.errors.full_messages() 39 render 'edit' 40 end 41 end 42 43 private 44 45 def user_params 46 params.require(:user).permit( 47 :name, :email, :password, 48 :password_confirmation) 49 end 50 51 # beforeアクション 52 53 # ログイン済みユーザーかどうか確認 54 def logged_in_user 55 unless logged_in? 56 flash[:danger] = "Please log in." 57 redirect_to login_url 58 end 59 end 60 61 # 正しいユーザーかどうか確認 62 def correct_user 63 # GET edit 64 # PATCH update 65 @user = User.find(params[:id]) 66 redirect_to(root_url) unless @user == current_user 67 end 68 end 69

②edit.html.erb

Ruby

1<% provide(:title, "Edit user") %> 2<h1>Update your profile</h1> 3 4<div class="row"> 5 <div class="col-md-6 col-md-offset-3"> 6 <%= form_for(@user) do |f| %> 7 <%= render 'shared/error_messages' %> 8 9 <%= f.label :name %> 10 <%= f.text_field :name, class: 'form-control' %> 11 12 <%= f.label :email %> 13 <%= f.email_field :email, class: 'form-control' %> 14 15 <%= f.label :password %> 16 <%= f.password_field :password, class: 'form-control' %> 17 18 <%= f.label :password_confirmation, "Confirmation" %> 19 <%= f.password_field :password_confirmation, class: 'form-control' %> 20 21 <%= f.submit "Save changes", class: "btn btn-primary" %> 22 <% end %> 23 24 <div class="gravatar_edit"> 25 <%= gravatar_for @user %> 26 <a href="http://gravatar.com/emails" target="_blank">change</a> 27 </div> 28 </div> 29</div>

試したこと

####①ルーティング
実際にプレビューでブラウザに入り、

Homeから新規登録ページに行くと以下のエラーメッセージが出ました。

イメージ説明

エラーメッセージに「Routing Error」とあったので、

routesを確認しました。

Ruby

1Rails.application.routes.draw do 2 3 get 'sessions/new' 4 5 root 'static_pages#home' 6 get '/help', to: 'static_pages#help' 7 get '/about', to: 'static_pages#about' 8 get '/contact', to: 'static_pages#contact' 9 get '/signup', to: 'users#new' 10 11 get '/login', to: 'sessions#new' 12 post '/login', to: 'sessions#create' 13 delete '/logout', to: 'sessions#destroy' 14 15 resources :users 16 17end 18

signup_pathとnew_user_pathがあることで、

これらのnewアクションへの重複によるものかと思いました。

Ruby

1signup GET /signup(.:format) users#new 2 3new_user GET /users/new(.:format) users#new

ただ、home.html.erbを見るとsignup_pathへ送っていて、

またRailsチュートリアルでも特に問題ないとのことだったので、

違うと判断しました。

####②誤字

リスト10.22〜10.26間でエラーが発生したため、

実装したチュートリアル内のコードを再度コピペし直しタイプミス等確認しましたが、エラーのままでした。

念のため10章の内容全てをコピペし直しましたが、変わりませんでした。

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

長文すみません。

1日調べましたが解決できず、先に進めなくて困っています。

ご協力お願いします。

DrqYuto👍を押しています

以下のような質問にはグッドを送りましょう

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

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

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

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

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

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

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

適切な質問に修正を依頼しましょう。

回答1

2

ベストアンサー

恐らくUserControllerのどこかに全角の空白が含まれているのだと思います。
全角空欄がないか、検索をして調べてみてください。

投稿2019/01/15 13:41

Yuinyan

総合スコア312

neko_daisuki, DrqYuto👍を押しています

良いと思った回答にはグッドを送りましょう。
グッドが多くついた回答ほどページの上位に表示されるので、他の人が素晴らしい回答を見つけやすくなります。

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

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

このような回答には修正を依頼しましょう。

回答へのコメント

sugisakisaki

2019/01/15 13:52

" "はそういうことだったのですね!一瞬で解決しました! 本当に助かりました!ありがとうございます!!!

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

ただいまの回答率
86.12%

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

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

質問する

関連した質問

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

Ruby on Rails 5

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

Ruby

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

Ruby on Rails

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