前提・実現したいこと
現在、Ruby on Railsの勉強の一環としてよくあるメモアプリにユーザー機能やグループ間での共有機能などを追加したものを開発しようとしています。開発はAWSのCloud9で行なっています。
発生している問題・エラーメッセージ
現在ログイン処理の機能を作っていて、ログイン失敗時にrenderメソッドを用いてログイン画面に戻そうと考えているのですがビューに<%= @error_message %>が表示されず困っています。
現在の状況としてはelse文は実行されているのですが、画面が何も変わらない状態です。
UsersControllerの内容
Rails
1 def login_form 2 end 3 4 def login 5 @user = User.find_by(name: params[:name], password: params[:password]) 6 if @user 7 redirect_to posts_url, notice: "ログインしました" 8 else 9 @error_message = "メールアドレスまたはパスワードが間違っています" 10 render :login_form 11 end 12 end
viewのソースコード
Rails
1<h1>ログインフォーム</h1> 2 3<% if @error_message %> 4 <div class="form-error"> 5 <%= @error_message %> 6 </div> 7<% end %> 8 9<%= form_with url: login_url do |f| %> 10 <div class="form-group"> 11 <%= f.label :name %> 12 <%= f.text_field :name, class:"form-control" %> 13 </div> 14 <div class="form-group"> 15 <%= f.label :password %> 16 <%= f.text_field :password, class:"form-control" %> 17 </div> 18 <%= f.submit class:"btn btn-primary" %> 19<% end %>
$ bundle exec rake routesの実行結果
Terminal
1$ bundle exec rake routes 2Prefix Verb URI Pattern Controller#Action 3 items GET /items(.:format) items#index 4 POST /items(.:format) items#create 5 new_item GET /items/new(.:format) items#new 6 edit_item GET /items/:id/edit(.:format) items#edit 7 item GET /items/:id(.:format) items#show 8 PATCH /items/:id(.:format) items#update 9 PUT /items/:id(.:format) items#update 10 DELETE /items/:id(.:format) items#destroy 11 posts GET /posts(.:format) posts#index 12 POST /posts(.:format) posts#create 13 new_post GET /posts/new(.:format) posts#new 14 edit_post GET /posts/:id/edit(.:format) posts#edit 15 post GET /posts/:id(.:format) posts#show 16 PATCH /posts/:id(.:format) posts#update 17 PUT /posts/:id(.:format) posts#update 18 DELETE /posts/:id(.:format) posts#destroy 19 users GET /users(.:format) users#index 20 POST /users(.:format) users#create 21 new_user GET /users/new(.:format) users#new 22 edit_user GET /users/:id/edit(.:format) users#edit 23 user GET /users/:id(.:format) users#show 24 PATCH /users/:id(.:format) users#update 25 PUT /users/:id(.:format) users#update 26 DELETE /users/:id(.:format) users#destroy 27 login GET /login(.:format) users#login_form 28 POST /login(.:format) users#login 29 rails_service_blob GET /rails/active_storage/blobs/:signed_id/*filename(.:format) active_storage/blobs#show 30rails_blob_representation GET /rails/active_storage/representations/:signed_blob_id/:variation_key/*filename(.:format) active_storage/representations#show 31 rails_disk_service GET /rails/active_storage/disk/:encoded_key/*filename(.:format) active_storage/disk#show 32update_rails_disk_service PUT /rails/active_storage/disk/:encoded_token(.:format) active_storage/disk#update 33 rails_direct_uploads POST /rails/active_storage/direct_uploads(.:format) active_storage/direct_uploads#create
実行結果
Terminal
1Started POST "/login" for 160.193.244.225 at 2019-09-27 10:15:00 +0000 2Cannot render console from 160.193.244.225! Allowed networks: 127.0.0.1, ::1, 127.0.0.0/127.255.255.255 3 (0.1ms) SELECT "schema_migrations"."version" FROM "schema_migrations" ORDER BY "schema_migrations"."version" ASC 4 ↳ /home/ec2-user/.rvm/gems/ruby-2.6.3/gems/activerecord-5.2.3/lib/active_record/log_subscriber.rb:98 5Processing by UsersController#login as JS 6 Parameters: {"utf8"=>"✓", "authenticity_token"=>"kJG1HfR+lZHw08RVVek5KZkH8mPGGumjJ9kxsnpfKb0JtH0mK1KeHgVzIBy/CYIPN7OweZLqDMcdnDxxukAldw==", "name"=>"test", "password"=>"[FILTERED]", "commit"=>"Save "} 7 User Load (0.2ms) SELECT "users".* FROM "users" WHERE "users"."name" = ? AND "users"."password" = ? LIMIT ? [["name", "test"], ["password", "xxx@example.com"], ["LIMIT", 1]] 8 ↳ app/controllers/users_controller.rb:68 9 Rendering users/login_form.html.erb within layouts/application 10 Rendered users/login_form.html.erb within layouts/application (4.2ms) 11Completed 200 OK in 268ms (Views: 257.8ms | ActiveRecord: 0.5ms)
試したこと
コントローラー内のelse文中の@error_message = "メールアドレスまたはパスワードが間違っています"以下に
raise "else文に処理が到達している: @error_message -> #{@error_message}"
を追加した場合の実行結果
Terminal
1Started POST "/login" for 160.193.244.225 at 2019-09-28 08:39:50 +0000 2Cannot render console from 160.193.244.225! Allowed networks: 127.0.0.1, ::1, 127.0.0.0/127.255.255.255 3Processing by UsersController#login as JS 4 Parameters: {"utf8"=>"✓", "authenticity_token"=>"kinthFQKFz4MYmh2kgkRpg4EpN/My3QlUs3G006IFtQLDCW/iyYcsfnCjD946aqAoLDmxZg7kUFoiMsQjpcaHg==", "name"=>"test", "password"=>"[FILTERED]", "commit"=>"Save "} 5 User Load (0.1ms) SELECT "users".* FROM "users" WHERE "users"."name" = ? AND "users"."password" = ? LIMIT ? [["name", "test"], ["password", "xxx@example.com"], ["LIMIT", 1]] 6 ↳ app/controllers/users_controller.rb:68 7Completed 500 Internal Server Error in 1ms (ActiveRecord: 0.1ms) 8 9 10 11RuntimeError (else文に処理が到達している: @error_message -> メールアドレスまたはパスワードが間違っています): 12 13app/controllers/users_controller.rb:74:in `login'
renderメソッドが期待通りに動作してるかの確認
ルーティングとコントローラとviewに一時的に以下の文を追加し、renderメソッドが動作してるか確認を行いました。
RubyOnRails
1 get "debag" => "users#debag" 2 post "test" => "users#test"
RubyOnRails
1 def debag 2 end 3 4 def test 5 if @test == 2 6 redirect_to :index 7 else 8 @error_message = "メールアドレスまたはパスワードが間違っています" 9 render :login_form 10 end 11 end
RubyOnRails
1<% @test = 1 %> 2<%= link_to("ログインフォーム", test_url, method: :post) %>
これらの文を追加した上でリンクに飛んだ結果、ログインフォーム内のエラーメッセージは問題なく表示されました。
原因の考察
else文の処理は行われ@error_messageも問題なく代入されていることから、何らかの原因でdef login内のrenderメソッドが上手く機能してないものと思われますが力が及ばず解決しないので質問させていただきます。
追記
デバッグを行いましたので、実行結果を追加させて頂きます。
viewの中の<% if @error_message %> の次の行に、 <% raise "if文に処理が到達している: @error_message -> #{@error_message}" %>を追加した場合
Terminal
1ActionView::Template::Error (if文に処理が到達している: @error_message -> メールアドレスまたはパスワードが間違っています): 2 1: <h1>ログインフォーム</h1> 3 2: 4 3: <% if @error_message %> 5 4: <% raise "if文に処理が到達している: @error_message -> #{@error_message}" %> 6 5: <div class="form-error"> 7 6: <%= @error_message %> 8 7: </div> 9 10app/views/users/login_form.html.erb:4:in `_app_views_users_login_form_html_erb___3908330072755420838_12276440' 11app/controllers/users_controller.rb:76:in `login'
回答1件
あなたの回答
tips
プレビュー