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

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

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

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

Ruby

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

Ruby on Rails

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

Q&A

解決済

1回答

52285閲覧

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

sugisakisaki

総合スコア15

Ruby on Rails 5

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

Ruby

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

Ruby on Rails

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

2グッド

2クリップ

投稿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👍を押しています

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

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

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

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

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

guest

回答1

0

ベストアンサー

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

投稿2019/01/15 13:41

Yuinyan

総合スコア312

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

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

sugisakisaki

2019/01/15 13:52

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問