テストバグ修正
環境
- rbenv local 2.6.6
- nodenv local 12.14.0
rails test:systemでテストを実行したところ
sign up success
login
logout
login faild not exist user
visit about pageができない
sign upは検証ツールで確かめると、viewからフォーム送信はできていることがわかる。
users_controller.rbのcreateアクションを確認しbinding.irbをいれたあとブラウザで再度パスワードを入力
def create @user = User.new(user_params) binding.irb if @user.save log_in @user flash[:success] = "成功" redirect_to @user else render :new end end
paramsで検証ツールでみたようにパスワードが送れてることが確認する。
irb(#<UsersController:0x00007fa315031c58>):001:0> params => <ActionController::Parameters {"authenticity_token"=>"dewo4jc5+wMJcaAOyaReiUi+UIiYyCTQe4rrq8Kg3HIYD03MBpptBSOXbOONtPckOTnX5d1SA/u6SZXhM5X9Og==", "user"=><ActionController::Parameters {"name"=>"meo", "email"=>"meo@gmail.com", "password"=>"1111", "password_confirmation"=>"1111"} permitted: false>, "commit"=>"Create my account", "controller"=>"users", "action"=>"create"} permitted: false>
@userが作れてるか確認するとpassword_digestがnilになっているので@user = User.new(user_params)が間違っている
irb(#<UsersController:0x00007fa315031c58>):002:0> @user => #<User id: nil, name: "meo", email: "meo@gmail.com", created_at: nil, updated_at: nil, password_digest: nil> irb(#<UsersController:0x00007fa315031c58>):003:0> @user = User.new(user_params) Unpermitted parameter: :password
パスワードが許可されてないとでるのでuser_paramsをさらに確認するとusers_controller.rbのuser_paramsアクションにpasswordが抜けていることがわかる。
passwordを追加。
def user_params params.require(:user).permit(:name, :email, :password, :password_confirmation) end
irbをexitで終了し再度ブラウザでPWを入力し@userを実行すると、[FILTERED]と表示されているので値がはいってることがわかる。
irb(#<UsersController:0x00007fa310d78510>):001:0> @user => #<User id: nil, name: "meo", email: "meo@gmail.com", created_at: nil, updated_at: nil, password_digest: [FILTERED]>
@user.valid?でバリデーションを通るか確認するとtrueになったのでうまくいっている。
irb(#<UsersController:0x00007fa3114c6bc8>):001:0> @user.valid? User Exists? (0.3ms) SELECT 1 AS one FROM "users" WHERE "users"."email" = ? LIMIT ? [["email", "meo@gmail.com"], ["LIMIT", 1]] ↳ (irb):1:in `create' => true
exitで終了するとCompleted 500 Internal Server Error in 30608ms (ActiveRecord: 3.2ms | Allocations: 67204)NoMethodError (undefined method `log_in' for #<UsersController:0x00007fa3114c6bc8> Did you mean? login_url):というエラーが出る。
これは新規作成はできたがlog_inというメソッドがないエラーであり、エディターでlog_inで検索するとsessions_helper.rbに書かれている。 ヘルパーはclass UsersController < ApplicationControllerのどちらかで読み込まれてることが多い application_controller.rbを見ると何も書かれていないので include SessionsHelperを追加しヘルパーを読み込ませる。 再度ブラウザから入力し@userとuser.valid?とlog_inをirbで通ることを確認してexitするとログインした状態になる。
binding.rbを削除しサーバーを再起動 メールアドレスとパスワードを入力しログインできることを確認してテストを実行rails test:system sign up successとlogin logoutは解決した。
login faild not exist user
存在しないユーザーでログインすると失敗する
emailとパスワードを適当にいれてログインすると以下のエラーになる。
authenticateメソッドはユーザーを認証するときのメソッドである
authenticateメソッドは定義されてないとでるので調べるとnilとでてくる
>> user.authenticate(params[:session][:password]) NoMethodError: undefined method `authenticate' for nil:NilClass from /Users/owner/exam1/Exam_RailsBasic_01/app/controllers/sessions_controller.rb:6:in `create' >> user => nil >> user = User.find_by(email: params[:session][:email].downcase) => nil >> params[:session][:email].downcase => "admin@example.com"
find byメソッドは存在しない場合nilをかえす。nilに対してメソッドを実行しようとしているのでエラーになっている。 また、findメソッドの場合はactiverecord例外が発生して500エラーになる。 →ぼっち演算子を使う。 &.(ぼっち演算子)はレシーバーであるオブジェクトに対してあるメソッドを実行した時、そのオブジェクトがnilの場合、nilを返すことでエラーを出さなくする
>> user&.authenticate(params[:session][:password]) => nil
visit about page aboutページへいくとエラーになる
ルーティングエラーなのでrails routesで調べると
static_pages_about GET /static_pages/about(.:format)
static_pages#aboutが間違っている。
localhost:3000/static_pages/aboutへアクセスしてみると static_pages_controllerにaboutアクションがないとでるのでstatic_pages_controller.rbにaboutアクションを作る
class StaticPagesController < ApplicationController def top; end def about; end end ※中身のないメソッドについて def about; end def about end def about render :about end これらはすべて同じ書き方でrenderは省略されている。
aboutアクション作成後、再度アクセスするとaboutアクションはあるがそれに対応するテンプレートがないとでた。 viewsを調べたらファイル形式が違っていて認識されていないことがわかった。
owner@ownernoMacBook-Pro Exam_RailsBasic_01 % ls app/views/static_pages about.rb top.html.erb
about.rb→about.html.erbに修正。
あとはlocalhost:3000/static_pages/aboutからlocalhost:3000/aboutへルーティングを変更するだけ get 'static_pages/about’からget '/about', to: 'static_pages#about'へ変更
テストが通ることを確認。