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

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

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

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

Ruby

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

Q&A

解決済

1回答

2021閲覧

Rails ログイン認証でflashメッセージを表示させたい

退会済みユーザー

退会済みユーザー

総合スコア0

Ruby on Rails 5

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

Ruby

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

0グッド

0クリップ

投稿2019/05/07 11:10

編集2019/05/08 01:02

Ruby on Rails を用いてユーザーのログイン認証機能を実装しているところです。

emailとpasswordで認証しログイン状態にします。

以下のようにログイン機能をsession_controller.rbに書いたのですが、間違ったpasswordを入力した際にflashメッセージの表示や画面の遷移が起きませんでした。入力された状態のままのようです。データーベースにある正しいemailとpasswordを送信するとログイン状態になります。

正しいemailと間違ったpasswordを送信する条件のもとbinding.pryでcreateアクションを調べたところ

  • user = User.find_by(email: params[:email].downcase)の部分の変数userにはデーターベース内から登録されたユーザーが入っている。
  • if user && user.authenticate(params[:password])の部分ではfalseである。
  • flashには何も格納されていない。

以上のことがわかりました。
どうやら

初歩的なこととは思いますがよろしくおねがいします。

該当コード

sessions_controller.rb

ruby:

1class SessionsController < ApplicationController 2 def new 3 end 4 5 def create 6 user = User.find_by(email: params[:email].downcase) 7 if user && user.authenticate(params[:password]) 8 log_in user 9 flash[:notice] = "ログインしました" 10 redirect_to :root 11 else 12 flash.now[:alert] = "メールアドレスかパスワードどちらかが正しくありません" 13 render :new 14 end 15 end 16 17 def destroy 18 session.delete(:user_id) 19 @current_user = nil 20 flash[:alert] = "ログアウトしました" 21 redirect_to :root 22 end 23end

ログイン用のページ 
new.html.erb

txt:new.html.erb

1<h1>ログイン</h1> 2 3<%= form_with url: login_path, method: :post do |f| %> 4 <div class="form-group"> 5 <%= f.label :email %> 6 <%= f.email_field :email, class: "form-control" %> 7 </div> 8 <div class="form-group"> 9 <%= f.label :password %> 10 <%= f.password_field :password, class: "form-control" %> 11 </div> 12 13 <%= f.submit "ログインする", class: "btn" %> 14<% end %> 15 16<%= link_to "アカウントを作成する", new_user_path %

application.html.erb flashメッセージ表示部分

<% if flash[:notice] %> <p class="notice"><%= notice %></p> <% end %> <% if flash[:alert] %> <p class="alert"><%= alert %></p> <% end %> <div class="container"> <%= yield %> </div>

環境

ruby 2.5.3p105
rails (5.2.3)
bcrypt (3.1.12)

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

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

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

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

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

guest

回答1

0

ベストアンサー

new.html.erb 内にflashの出力処理を書く必要があると思います。

参考:https://qiita.com/riku1027/items/3264316c62e05e45c8a1

投稿2019/05/07 12:53

iwamot

総合スコア1154

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

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

退会済みユーザー

退会済みユーザー

2019/05/07 23:05

ご回答ありがとうございます。 書き忘れていたのですが以下のようにapplication.html.erbに書いており、他のflashメッセージ(ログインしました。など)は表示されます。 以下application.html.erb一部 ``` <% if flash[:notice] %> <p class="notice"><%= notice %></p> <% end %> <% if flash[:alert] %> <p class="alert"><%= alert %></p> <% end %> <div class="container"> <%= yield %> </div> ```
iwamot

2019/05/07 23:44

あれ、`<%= flash[:notice] %>` や `<%= flash[:alert] %>` のようにしなくても表示されますか? それはともかく、もしflashの使用にこだわらないのであれば、他の処理と同様にリダイレクトしたり(フォームは空になりますが)、普通の変数(@messageなど)で処理したりする方法も考えられます。
退会済みユーザー

退会済みユーザー

2019/05/09 10:45

遅くなりました。 まずflash[:notice]やflash[:alert] のように変更しましたが変わりませんでした。 フォームを空にはしたくなかったので@message変数を作り <% if @message %> <p class="notice"><%= @message %></p> <% end %> のようにviewに書き込みましたが同じように読み込まれませんでした。 フォームを空にしたくなかったのでrenderにしておりましたが、redirect_toだとメッセージが表示されたのでこちらを使わせて頂きます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問