LoginSignup
4
2

More than 3 years have passed since last update.

ユーザーの新規登録時に入力なしの初期値を設定する【Ruby on Rails】

Last updated at Posted at 2020-03-24

目的

ユーザーの新規登録時に、直接入力させずにテーブルに初期値を保存させること。

使用する技術

  • gem devise

実践

以下のテーブルが作成してあるとします。

Column Type Options
username string null: false, unique: true
email string null: false, unique: true
password string null: false
coin integer null: false

今回は、ユーザー登録フォームで

  • username
  • email
  • password

の3項目をのみを入力させます。
ここで、coinカラムは入力させずに、初期値0としてテーブルに保存します。

事前準備

すでに、gem deviseが導入され、コントローラとビューの作成が終了しているものとします。
(このような画面まで用意されている所からです)
devise:registrations:new.png

deviseのカスタマイズ

ここからは、デバイスのカスタマイズを行っていきます。
初めにdeviseのコントローラを作成して編集できるようにします。

$  rails g devise:controllers users

app/controller/users/のフォルダにコントローラが作成されました。
このフォルダ内のregistrations_controller.rbを使用していきます。

次に、ルーティングを一度確認しておきます。

$  rails routes

# 結果
Prefix                 Verb   URI Pattern                    Controller#Action
new_user_registration  GET    /users/sign_up(.:format)       devise/registrations#new

今のままでは、作成したregistrations_controller.rbが呼び出されていない状態なので、これを呼び出す記述をします。

config/routes.rb
Rails.application.routes.draw do
  devise_for :users, controllers: {
    registrations: 'users/registrations',
  }
end

devise導入時に自動的に記述されたdevise_for :usersに続けて、このように記述します。
編集後、もう一度ルーティングを確認します。

$  rails routes

# 結果
Prefix                 Verb   URI Pattern                    Controller#Action
new_user_registration GET    /users/sign_up(.:format)       users/registrations#new

devise/registrations#new → users/registrations#new
に変わっていればOKです。

コントローラに初期値を設定

コントローラにnewメソッドとcreateメソッドを定義していきます。

registrations_controller.rb
class Users::RegistrationsController < Devise::RegistrationsController

  # 省略

  def new
    @user = User.new
  end

  def create
    @user = User.new(sign_up_params)
    unless @user.valid?
      flash.now[:alert] = @user.errors.full_messages
      render "devise/registrations/new" and return
    end
    @user[:coin] = 0
    @user.save
    sign_in(:user, @user)
    redirect_to root_path
  end

  # 省略

registrations_controller.rbはコメントアウトで記述がされていて、Devise::RegistrationsControllerで最初からメソッドが定義されています。
カスタマイズするときは、コメントアウト部分を消してオーバーライド(上書き)していきます。

重要なのは、ここです。

@user[:coin] = 0

@user = User.newの時点ではcoin: nilだったところに、0を代入します。
これで、coinカラムに0が入りました。あとはそのまま、データベースにレコードを登録 + ログイン + root_pathにリダイレクトを行っています。

ちなみに補足しておくと、、

unless @user.valid?
  flash.now[:alert] = @user.errors.full_messages
  render "devise/registrations/new" and return
end

ここは、バリデーションに引っ掛かったときにエラーメッセージを表示させて、登録フォームのページを返すということをしています。(これがない場合、登録されずにTOPページに遷移したりします)

最後に

ユーザーの新規登録の場合はdeviseをカスタマイズする必要がありましたが、
普通のテーブルであれば、new,createメソッドのどちらかに初期値を代入するだけで簡単に保存させられます。

参考

Qiita 【オブジェクト生成時にインスタンス変数の初期値を設定する】

4
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
2