SSブログ

forgot_passwordを勉強がてらに直してみる。 [プログラミング]

以前にRailsのforgot_passwordを、Restful AuthenticationとAASMをからめて動作確認した。でも、不具合が多くて、全然カタくなくて困った。このままじゃ使えないので、自分の環境だけでも動くようにしたい。今分かっていて現存する不具合を直してみる。

・リセットしたいメールアドレスが、データベースに存在しないと内部エラーになる


前提となるプロジェクトの環境は、以下のリンクにて願います。

 http://miff.blog.so-net.ne.jp/2010-11-25
 http://miff.blog.so-net.ne.jp/2010-11-26


今までの状況を残したいので、元々あった「Restful Authentication + AASM + forgot_password」なプロジェクトのディレクトリごとコピーして、その中で、

 rake db:create:all

で新しくテーブルを置く場所(スキーマ)を作ってあげようとした。でも元々あるよって言われた。ディレクトリをいちいち見ないで、どこかに設定が書いてあるらしい。config/databse.yamlだった。そおいや、Railsのバージョンが低いと、ここも自分で書かなくちゃいけなかったらしい。でも、Rails2以降ぐらいのは自動的に作ってくれるのよね。ま、いいや、細かい事は。


んで、自分でコピーしたディレクトリ名で設定し直してみる。今まで何も考えないで、スキーマを作りまくってたので、mysqlの中が面倒な事に。しばらくはdevelopmentだけでいいや。そのうちデプロイ(capistrano)は他の機会でやりましょう。

rake db:create
rake db:migrate
ruby script/server



/signupで登録しようとしたら、ダメって言われた。

 SocketError in UsersController#create
 getaddrinfo: nodename nor servname provided, or not known

今までそれまでの使っていたテーブルを使い回していたので、サインアップすることって少なかったので、穴が出来ていた模様。どこから問題が出ていたのか分からないので、過去の挙動を見てみる。あれ?動いてたはずなんだけどなぁ。

と、思ったら、Macのネットワーク設定が悪かったらしい。LANからは見れるけど、Mac自体が外を見られない状態になってたのでした。それでLANの中は見えて、WindowsのWebブラウザからMacをRailsサーバが見れたけど、サーバのMac自体がWebの方を見られなかったみたい。で、メールを発信する時にエラーが出た、と。

本格運用のときは、どうせWebからのアクセスしかしないので、そもそもメールを送れない以前に、WebブラウザでRailsサーバを見られないもんね。結構、開発時の盲点でした。やっぱり外からアクセスする回線がないと、動作確認はキツいかも。でも、この不案内なエラーはどうにかして欲しい。ソースに問題があるかと思っちゃうじゃん。クライアント操作を別マシンでやったので、DHCPで自動割り振りはやめて、固定にしたためにダメだったのです。慣れない事はやりたくないけど、今後のために良い経験値を得ました。

それにしても、コンピュータ全般に言える事だけど、大抵のエラー表示って分かりづらいなぁ。



引き続き、動作確認をします。Railsから送るメールが、Gmailでずっと迷惑メールになってましたけれども、迷惑メールではないと受信トレイに戻したら、その後は迷惑メールから除外されました。Gmailとかはそういう運用設定でいいかな。メールヘッダを変に細工するよりは、ずっと健全だろうなとは思う。あんまりにメールが除外されちゃう状態であったら、少しは考えなくてはいけないけれども。

やっぱり、存在しないメールアドレスを入れると、内部エラーになる。

NameError in Forgot passwordsController#create
undefined local variable or method `user_model_name' for #< ForgotPasswordsController:0x104b5d0d8>


さてと、forgot_password_controller.rbの、createの19行と29行に問題があると出ている。19行目は

 respond_to do |format|

で、ブロックの中でどうにかなってんぞ、という事らしい。で、29行目は、と。

flash[:error] = "We can't find a #{user_model_name} with that email. Please check the email address and try again..."


flashってなんだ? 文字列入れてんだから、文字列型のオブジェクトの配列だよな。いや、そうじゃなくて、user_model_nameって知らねーとか言ってるんだった。確かにこのファイル内では、他に初期化されてるところがないので、nilいきなり突っ込まれても困るかもな〜。ええと他のファイルわ、と。プラグインフォルダの中のテンプレートにしかないなぁ。インストールする時に、キッチリ入れられてないらしい。

さてと、プラグインインストール時に上手くいってないみたい。とりあえず場当たり的に直して、その後、プラグインとして成り立つようにやるべきかな。これからはそういう方針で行く。

 vendor/plugins/forgot_password/generators/forgot_password/templates/controller.rb

が、雛形になっているみたい。ってか.rbとか書いてあるけど、内容的には.erbっぽい埋め込みなコードなんだな。あ、わかった。

flash[:error] = "We can't find a #{user_model_name} with that email. Please check the email address and try again..."

のuser_model_nameを、<%= %>でネストしてないからダメなんだね、たぶん。で、生成の時、そのまま、ありもしない変数が突っ込まれて、ダメでした残念、状態になってるらしい。本当は:userが書かれないといけないんだね、本当は。ちょっと訂正して動かしてみる。意図的に無いメールアドレスを指定して間違うと、すぐに処理が戻ってくるようになって、内部エラーが出なくなった。うむ、大丈夫になったみたい。動作確認の先を進む。

 EOFError in Forgot passwordsController#update_after_forgetting
 end of file reached

なんだか見た事のあるエラー。メールアドレスが大なり小なりでネストしてない時に出るのでした。あれ?そこは前回訂正したはずなんだけどなぁ。forgot_passwords_controller.rbをチェック。細かい理由は分からんのだけど、状況を再現する事はできた。


それは、不具合かどうかわからんのだけれど、既存ユーザーでログイン中に、パスワード変更しようとすると、この状態に陥るらしい。パスワードがわからない状態で、ログインしているのはそもそも考えられないんだけど、そういう選択肢がないわけではない。それをやれる状態には、無理矢理URLを突っ込んだり、以前に中途半端にしてページを開きっぱなしなのを忘れていた、とかでできて、考えられないわけではない。何にしてもログアウトしてからやってもらわないとね。こういう内部エラーがユーザー側に出ちゃうのはよろしくないし、ちょっと恥ずかしい。

実はその仕様は、パスワード変更(/forgot_password)に関わらず、Restful Authenticationで、普通の登録(/signup)のときも同じ事で、同様のエラーが出る。Restful Authenticationでの実装の仕方をマネるという意味ではOKだけど、一般的にどうなのよと言われると、問題があると言わざるを得ない。ログイン状態かどうかチェックする必要が出てきた。それか単純に強制ログアウトさせるのが妥当かも。

これを直すとしたら、Restful Authenticationの根本的なところからいじらないといけなさそうなので、今回はスルーします。次回以降のお題ですね。


他の目立ったエラーは特にない。あとは作り込んであげるだけで、そんなに問題となることはなさそうだ。まぁ見つかったら直すだけですが。もっと修正が難航すると思ってたら、外に公開しているだけあって、基本動作はなんとかなってる。次はプラグインとして成立するように直すつもり。

タグ:Ruby Rails2
nice!(0)  コメント(0) 
共通テーマ:パソコン・インターネット

nice! 0

コメント 0

コメントを書く

お名前:[必須]
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。