Torihaji's Growth Diary

Little by little, no hurry.

Railsのdeviseにおいて新規登録時に裏側でnameにemailの@より前のものを差し込む

はじめに

みなさん、こんにちは torihaziです

今日は現在やっている個人開発において、タイトルのようにdeviseの扱いに少し詰まったので

次回似たようなことをやる時につまらないように書き残しておこうかと思って今書いてます

ちなみに RailsAPIモード、deviseとdevise-token-auth使ってます。

何をやりたいか

deviseを使って新規登録を作る際、frontendからは emailとpasswordしか送らないけど

backend側で emailの@より前を切り取ってそれを最初はnameにして差し込んでしまおうということをします。

なんでこういうことをするかというと

んー、nameをわざわざ新規登録formからuserに入力させるのがダサいかなと思ったからです。

あと実務で作成しているアプリケーションがそのようにしていて、

確かにその方がUX?も良いだろうし、、、てな感じですね。

他の方法があれば教えてください。

やる

DeviseTokenAuth::RegistrationsController を継承して新しくControllerを作成します。

その後に 下記メソッドをオーバーライドします。

        def build_resource
          super
          email = params[:email]
          password = params[:password]
          name = email.split("@")[0]
          @resource.name = name
          @resource.password_confirmation = password
        end

devise-token-authの公式ドキュメントを参照すると、次のような記載があります。

devise_token_auth/docs/usage at master · lynndylanhurley/devise_token_auth · GitHub

Email registration. Requires email, password, password_confirmation, and confirm_success_url params (this last one can be omitted if you have set config.default_confirm_success_url in config/initializers/devise_token_auth.rb). A verification email will be sent to the email address provided. Upon clicking the link in the confirmation email, the API will redirect to the URL specified in confirm_success_url. Accepted params can be customized using the devise_parameter_sanitizer system.

(今思ったんですが、この必須とされているemail, passwordとか項目いじれないんですかね。)

email, password, password_confirmation, (confirm_sucess_urlはconfigで設定するので無視)が必須らしいですが、

frontendからはemailとpasswordのformしか用意したくないです。

確認用passwordとかもfrontで表示非表示ボタン等用意すれば良いでしょ。

まぁそんな状況だったので今回backend側でやむなしでこうしました。

※ ちなみに@resourceとするのは公式で肝心の作成対象(今回であればUser)が@としているからです。

resourceではないのでご注意を。自分は最初それで少し詰まりました。

また

def create
  super do |resource|
    updateの処理
  end
end

みたいなやり方もありそうですが、今回自分がモデルのvalidatesに nameを必須にするようなことを書いていたため

このようにせざるを得ませんでした。

終わりに

他にいい方法あれば教えてください。