🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Cloud9

Cloud9は、クラウドからのプログラミングが可能になるWebサービス。IDEとしての機能が搭載されており、GitHubやHerokuなど他ツールとの連携も可能です。ブラウザ上で動くため、デバイスに関係なく開発環境を準備できます。

Ruby on Rails 5

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

terminal

Terminalは、Apple社のmacOSに標準で付属しているUNIX端末エミュレータ。UNIXコマンドによってMacの操作および設定を行うことができます。

ログイン

ログインは、ユーザーがコンピューターシステムにアクセスするプロセスの事を呼びます。

AWS(Amazon Web Services)

Amazon Web Services (AWS)は、仮想空間を機軸とした、クラスター状のコンピュータ・ネットワーク・データベース・ストーレッジ・サポートツールをAWSというインフラから提供する商用サービスです。

Q&A

解決済

1回答

1530閲覧

renderメソッドを使用してビューを表示させたい

Arly3

総合スコア5

Cloud9

Cloud9は、クラウドからのプログラミングが可能になるWebサービス。IDEとしての機能が搭載されており、GitHubやHerokuなど他ツールとの連携も可能です。ブラウザ上で動くため、デバイスに関係なく開発環境を準備できます。

Ruby on Rails 5

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

terminal

Terminalは、Apple社のmacOSに標準で付属しているUNIX端末エミュレータ。UNIXコマンドによってMacの操作および設定を行うことができます。

ログイン

ログインは、ユーザーがコンピューターシステムにアクセスするプロセスの事を呼びます。

AWS(Amazon Web Services)

Amazon Web Services (AWS)は、仮想空間を機軸とした、クラスター状のコンピュータ・ネットワーク・データベース・ストーレッジ・サポートツールをAWSというインフラから提供する商用サービスです。

0グッド

0クリップ

投稿2019/09/27 10:50

編集2019/09/30 06:01

前提・実現したいこと

現在、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'

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

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

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

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

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

winterboum

2019/09/27 11:05

login_form のviewを見せて下さい
siruku6

2019/09/27 12:38

winterboumさんの説明で、もしわからなければですが、「viewを見せて」というのはviewの見た目が知りたいということではなく、「viewファイルのソースコードを掲載して下さい」という意味になります。 (馬鹿にしてるように感じられてしまったらすみません。念のためでした。)
Arly3

2019/09/28 07:12

編集依頼ありがとうございます。追記にviewのソースコードを追加させていただきました。
siruku6

2019/09/28 07:14

おそらくですが、「login_formのview」とありますので、ログインに必要な情報を入力するフォームのソースが書かれたファイルが必要だと思います。 Arly3さんが掲載して下さったのは、ログイン結果を表示する画面のviewですね。
Arly3

2019/09/28 07:24

指摘ありがとうございます。login_formのviewに修正させていただきました。
siruku6

2019/09/28 07:31

私からも質問なのですが、エラーメッセージが表示されない代わりに画面上では何が起きますか? エラーが出ますか、画面上に何も変化が起きないですか?それとも「ログインしました」などと表示されたりしますか?
siruku6

2019/09/28 07:31

修正ありがとうございます
Arly3

2019/09/28 07:43

質問ありがとうございます。色々と情報不足ですいません。 redirect_to login_url としてlogin_formのビューを表示させた場合はエラーメッセージは表示されず、空の入力フォームが表示されます。 render :login_form としてlogin_formのビューを表示させた場合は何も変化が起きず、エラーメッセージも表示されませんでした。 お手数お掛けしますが、また追加で質問などあればお願いします。
siruku6

2019/09/28 08:04

デバッグの提案です 一時的にですが、 @error_message = "メールアドレスまたはパスワードが間違っています" の下に、以下の行を追加してみて、どんなエラーが出るか確認してみてください。 raise "else文に処理が到達している: @error_message -> #{@error_message}" あとは bundle exec rake routes の実行結果も質問に記載いただけると...
winterboum

2019/09/28 08:42

def login @user = User.find_by(name: params[:name], password: params[:password]) これは UsersControllerの何行目ですか?
Arly3

2019/09/28 08:58

デバッグの提案して頂いてありがとうございます。 デバッグの実行結果及びbundle exec rake routesの実行結果を質問に記載しました。
winterboum

2019/09/28 09:00

> これは UsersControllerの何行目ですか? 判ったので良いです。 68行目ですね。 「もしかして def login が重複して定義されていないか」みたかったのですが、そうでは無いようですね。
Arly3

2019/09/28 09:01

winterboumさん質問ありがとうございます。行数ですが 67 def login 68 @user = User.find_by(name: params[:name], password: params[:password]) となっています。お手数お掛けしますが追加で質問・提案等あればよろしくお願いします。
winterboum

2019/09/28 09:05 編集

勘違いだったので削除
siruku6

2019/09/28 09:14

デバッグありがとうございます。 これで、else以下の処理が実行されていて、@変数もきちんと代入されていることがわかりました。 なので、問題は render :login_form から先の処理なんですが...
winterboum

2019/09/29 08:16

はてな?? ですね
siruku6

2019/09/29 14:07

ですね( ´∵`) 試しにですが、 <% if @error_message %> の次の行に、 <% raise "if文に処理が到達している: @error_message -> #{@error_message}" %> でも置いてみましょうか。。
Arly3

2019/09/30 04:50

デバックの提案ありがとうございます。デバッグの実行結果を追加させていただきました。
winterboum

2019/09/30 06:40

class form-error の CSS 見せて下さい
Arly3

2019/09/30 13:45

winterboumさん指示ありがとうございます。form-errorのcssはまだ書いてないので問題ないと思います。一応消して実行した際も変化はありませんでした。
nakki

2019/10/01 08:01

routes.rbに get '/login_form' , to: "users#login_form" を追加する必要があるのではないでしょうか。
siruku6

2019/10/01 11:46

if文にも処理が到達していて、しかも@インスタンス変数にもエラーメッセージが格納されているとなると、winterboumさんのおっしゃるように、疑わしいのは見た目かな、と私も考えています。 F12開発者ツールを使った経験はありますか? もし経験がおありであれば、そのメッセージが表示されるべき場所のhtmlタグを見ていただくのがいいかなと思いました。
Arly3

2019/10/01 13:24

解決しました。様々な指摘や提案を頂き大変助かりました。ありがとうございました。
guest

回答1

0

自己解決

解決しました!
form_withのオプションに```local: true

<%= form_with url: login_path, local: true do |f| %> としたところ正しくエラーメッセージが表示されページも遷移しました。 様々な指摘や提案を頂き大変助かりました。ありがとうございました。

投稿2019/10/01 13:23

Arly3

総合スコア5

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

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

siruku6

2019/10/01 13:36

お疲れさまでした!!!! かいけつしてよかったです!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問