Rails4 Devise で ユーザー登録フォームに由来しない属性を、サインアップ時にDBテーブルに保存する

スポンサーリンク

Rails4 で Devise と OmniAuth で、Twitter/Facebook のOAuth認証と通常フォームでの認証を併用して実装 | EasyRamble で、Twitter/Facebook の OAuth認証と通常フォームのユーザ登録を併用する実装を行いました。通常サインアップ時の uid フィールド設定の実装で、やはりフォームを経由させたくなかったので、調べたら Devise::RegistrationsController の build_resource(hash=nil) メソッドをオーバーライドすれば、目的を実現できることが分かった。

【お知らせ】 英単語を画像イメージで楽に暗記できる辞書サイトを作りました。英語学習中の方は、ぜひご利用ください!
画像付き英語辞書 Imagict | 英単語をイメージで暗記
【開発記録】
英単語を画像イメージで暗記できる英語辞書サービスを作って公開しました
スポンサーリンク

— 環境 —
Rails 4.0.1
Devise 3.2.2

class Devise::RegistrationsController

class Devise::RegistrationsController を読むと、以下のコードを確認できました。

ということで 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

デバッグ時は、@resource_hash = hash などと build_resource(hash=nil) 内に定義して、ビューで pp @resource_hash とすれば、ブラウザで hash の中身を簡単に確認できて便利です。

{“email”=>”***”, “password”=>””, “password_confirmation”=>””, “name”=>”***”, “uid”=>”20d287fe-a639-4329-8285-ff8afb2a4f31”}

以上、build_resource(hash=nil) のオーバーライドで、ユーザー登録フォームを由来せずに、モデルに追加した独自の属性を、users テーブルに保存できるようになりました。うーん、最初からこっちの方法に気付いていれば…。

スポンサーリンク
パーフェクト Ruby on Rails は、最近読んだ Rails 本の中では一番役に立った本です。Chef や Capistrano など Rails と共によく使用される技術にも触れてあります。Ruby on Rails 4 アプリケーションプログラミングは、入門的な内容で Rails の機能全体を網羅されています。
 
スポンサーリンク

Leave Your Message!