Ruby勉強会を開催しました(2015#9)

猛暑だったと思ったら、急に夏が終わってしまったような今日この頃です。
良く祖母から「暑さ寒さも彼岸まで」という言葉を聞かされて、子供ながらに暑さ、寒さに耐えてきた記憶がありましたが、今年は秋の彼岸がまだまだ先なのに・・・やはり異常気象なのでしょうか。

さて、9月も張り切ってRuby勉強会を開催しました。今回の参加者は6名でした。新人2名も参加し、Rubyの資格取得に向けて頑張って勉強してもらっていましたが、めでたく新人SがSilverの認定試験に合格しました。
次はGoldを目指してもらおうと思います。

旧人達は思い思いの学習をしていますが、一部メンバは自社サービスの開発に向けた取組みを行いました。

前回も記載したかと思いますが、私が担当しているのは自社内で利用するグループウェアです。
完成までの道のりは長いですが、一部の機能については利用できるようになってきました。
8月に開催したインターンシップの参加者に利用してもらい、日報の提出に「回覧機能」を利用しました。やはり実務で使い始めると気合も入ってきますね。
機能の実装はだいぶ進んできたこともあり、UI周りの見直しなども行いましたが、そろそろ社内の一部メンバに利用してもらおうかと思いまして、ログイン画面を自動生成された状態から今風?にしてみました。

login form

認証にDeviseを利用しているといろいろと親切にエラーメッセージを表示できるのですが、うっとうしく感じることがありませんか?
例えば、ログアウトしただけで、「ログインしてください」メッセージが表示されてしまいますよね。

なるべくシンプルな表示にしたかったので、ログイン画面にはalertが表示されない様にビューのテンプレートからメッセージ表示部分を削除してしまいました。
これですっきりと思ったのですが、ユーザIDやパスワードの入力ミスのときにパスワードの入力欄がクリアされるのですが、それだけでは認証処理が行われたのかどうかわかりにくくなってしまいました。

やはり認証の失敗はユーザに伝わるようにしたいですよね。一部のエラーのみDiviseのエラーメッセージを表示するにはControllerのカスタマイズが必要になりそうです。情報を見つけるのもなかなか大変そうなので、手っとり早く認証の失敗を通知する方法を考えてみました。

  • エラーを伝える方法の見直し:
    エラーメッセージは表示せず、ログインフォームをシェイクする。(OSXの認証失敗時のような)

  • 認証エラーが発生したことの検出方法:
    /user/sign_inのURLで認証するので、エラーが発生した時のURLをチェックする

この2つで対処してみました。

フォームをシェイクするのは、UIkitのAnimationが利用できます。
画面遷移する前のURLはrequest.refererで取得できます。 よって、ログイン画面とrequest.refererが一致し、且つalertがあれば、認証エラーと判断することにしました。時間があるときにもう少しDeviseの仕組みもしらべてみようと思います。
エラーメッセージは表示されませんが、ユーザには伝わると思いますよ。

それから、Deviseの内部に手を入れてしまう(メソッドのOverrideも含めて)と、Deviseがアップグレードした時に変更の必要性が生じる可能性も考えられます。(以前自己学習のために作ったgemが新バージョンに対応できなくなったりしたことがありました・・・)
ですのでDeviseの深いところに入り込みすぎないということもポイントになるかもしれませんね。