- 更新日: 2013年12月15日
- Devise
Rails4 Devise で ユーザー登録フォームに由来しない属性を、サインアップ時にDBテーブルに保存する
Rails4 で Devise と OmniAuth で、Twitter/Facebook のOAuth認証と通常フォームでの認証を併用して実装 | EasyRamble で、Twitter/Facebook の OAuth認証と通常フォームのユーザ登録を併用する実装を行いました。通常サインアップ時の uid フィールド設定の実装で、やはりフォームを経由させたくなかったので、調べたら Devise::RegistrationsController の build_resource(hash=nil) メソッドをオーバーライドすれば、目的を実現できることが分かった。
— 環境 —
Rails 4.0.1
Devise 3.2.2
class Devise::RegistrationsController
class Devise::RegistrationsController を読むと、以下のコードを確認できました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
class Devise::RegistrationsController < DeviseController # ・・・ # GET /resource/sign_up def new build_resource({}) respond_with self.resource end # POST /resource def create build_resource(sign_up_params) # ・・・ end # ・・・ def build_resource(hash=nil) self.resource = resource_class.new_with_session(hash || {}, session) end # ・・・ end |
ということで create アクションの build_resource(hash=nil) に sign_up_params が渡されて、resource が組み立てられる。なので、build_resource(hash=nil) をオーバーライドして hash に任意の { :属性 => 値 } を追加してやれば、ユーザー登録フォームに由来しない独自の属性をDBのユーザーテーブルに保存できる、と。
Devise::RegistrationsController の build_resource(hash=nil) をオーバーライド
以下のコード、Users::RegistrationsController < Devise::RegistrationsController で build_resource(hash=nil) をオーバーライドしました。 app/controllers/user/registrations_controller.rb
1 2 3 4 5 6 7 8 |
class Users::RegistrationsController < Devise::RegistrationsController def build_resource(hash=nil) hash[:uid] = User.create_unique_string super end end |
デバッグ時は、@resource_hash = hash などと build_resource(hash=nil) 内に定義して、ビューで pp @resource_hash とすれば、ブラウザで hash の中身を簡単に確認できて便利です。
以上、build_resource(hash=nil) のオーバーライドで、ユーザー登録フォームを由来せずに、モデルに追加した独自の属性を、users テーブルに保存できるようになりました。うーん、最初からこっちの方法に気付いていれば…。
- – 参考リンク –
- How To: Override build_resource({})
- Devise > Custom fields during registration – Google グループ
- Devise の関連記事
- RailsのDevise認証機能での実装チェックリストまとめ
- Deviseで送信されるメールのfrom(送信者メールアドレス)を変更
- Facebook の OAuth 認証で OAuthException(191)エラー
- Rails Devise でパスワードリセットなどのメールテンプレート(Mailer ビュー)をカスタマイズ
- Rails + Devise 環境でのフレンドリーフォワーディング機能を修正
- Deviseでユーザー登録完了時にウェルカムメールを送信する
- Rails Devise でユーザーがプロフィール情報を更新後に元のページにリダイレクトさせる
- Devise でユーザーがパスワードなしでアカウント情報を変更するのを許可
- Rails Deviseの日本語化辞書ファイル(devise.ja.yml)
- Rails + Devise で admin ユーザー(管理者)を削除できないようにする
Leave Your Message!