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

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

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

Deviseとは、Ruby-on-Railsの認証機能を追加するプラグインです。

Ruby on Rails

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

Q&A

2回答

713閲覧

【RoR + Devise】deviseでエラーメッセージ(alert)を表示したい

pecchan

総合スコア555

Devise

Deviseとは、Ruby-on-Railsの認証機能を追加するプラグインです。

Ruby on Rails

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

0グッド

0クリップ

投稿2017/10/29 00:48

編集2017/11/08 08:36

Ruby on Rails 5 と deviseにて
社内システムに、ログイン機能を追加しました。

こちらのおかげで、退職者をログイン出来ないようにしました。
※退職者がログインすると、強制的にログイン画面に戻される

その際、アラートを表示させたく、
以下のようにしましたが何も表示されません。

deviseにてアラートを表示するにはどうすればよろしいのでしょうか?

宜しくお願い致します。

1.ログインの可否判定 ※controllers/application_controller.rb

ruby

1class ApplicationController < ActionController::Base 2 3 def after_sign_in_path_for(resource) 4 if current_employee.retire_date.blank? 5 else 6 sign_out Employee.find(current_employee.id) 7 8 #表示されない 9 flash[:alert] = '退職者はログインできません' 10 11 #こちらも表示されない 12 flash.now[:alert] = '退職者はログインできません' 13 end 14 root_path 15 end 16

2.アラート表示部分 ※views/layouts/application.html.erb

ruby

1 2 <div class="row"> 3 4 <% if alert %> 5 <%= alert %> 6 <% end %> 7 8 </div> 9 10

2017/11/08 追記
flashが表示されない原因が分かったかもです。
コントローラのsign_out でログアウトするため、
セッションと共にflashの内容も消えてるのだと思います。

そこで以下のようにしました
※controllers/application_controller.rb

ruby

1 #flash.now[:alert] = '退職者はログインできません' 2 redirect_to "/employees/sign_in", alert: '退職者はログインできません' 3 4

ですが下のようにDoubleRenderエラーになってしまいます。
イメージ説明

ダブルレンダーエラーを回避出来ればメッセージを表示できそうに思うのですが
分かる方教えていただけないでしょうか?

宜しくお願い致します。

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

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

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

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

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

guest

回答2

0

そもそも、「認証したくないユーザーが居る」場合は、

https://github.com/plataformatec/devise/wiki/How-To:-Customize-user-account-status-validation-when-logging-in

このような仕組みが用意されています。
この仕組みを使えば、拒否されたときのエラーメッセージもカスタマイズする方法が用意されているようです。

日本語の記事をみつけました。
https://qiita.com/Naggi-Goishi/items/49f758608f93286a3701

投稿2018/08/29 17:03

編集2018/08/29 17:04
takumiabe

総合スコア661

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

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

0

View を以下のように変更すれば表示されると思います。

<!-- views/layouts/application.html.erb --> <% if flash[:alert].present? %> <%= flash[:alert] %> <% end %>

sign_out 時にリダイレクト処理が行われるので、Controller では flash を使用してください。

Ruby

1# controllers/application_controller.rb 2 3class ApplicationController < ActionController::Base 4 5 def after_sign_in_path_for(resource) 6 if current_employee.retire_date.blank? 7 else 8 sign_out Employee.find(current_employee.id) 9 flash[:alert] = '退職者はログインできません' 10 end 11 root_path 12 end 13end

投稿2017/11/07 05:29

編集2017/11/07 07:29
gesorein

総合スコア101

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

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

pecchan

2017/11/07 06:40

minadukirein 様 有難う御座います。 viewを変更しましたが、何も表示されませんでした・・・。
gesorein

2017/11/07 07:26

申し訳ございません、勘違いしている箇所がありました。 sign_out 時にリダイレクト処理が行われるので、 flash.now[:alert] ではなく、flash[:alert] を利用してみてください。 ※回答のコードは編集しました
pecchan

2017/11/07 07:35

度々すみません、有難う御座います。 Viewは変えずControllerのflash.now[:alert] を、flash[:alert] に変えましたが同じでした・・・orz
gesorein

2017/11/07 07:59

表示されませんか...。私も同じような処理を試したときに、 掲示したコードでうまくいったのですが、環境が違うので何か別の問題があるのかもしれません。 お力になれず、申し訳ないです。
pecchan

2017/11/07 08:02

とんでもないです。 お付き合いいただき有難う御座います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問