84日目
今日の学習
Ruby on Rails
devise
作成したUserモデルにカラムを追加
初めてのdevise ② -- カラムを追加してみる -- ~ やってみようカスマイズ! ~ - Qiita
gem devise
で作成したモデルにはemail
とpassword
カラムしかない。
Userモデルに他のカラムも追加したい場合はどうすればいいか、調べた過程をメモ。
まず、以下のコマンドを実行する。
rails g devise User
作成されたdb/migrate/***(日付)_devise_create_users.rb
ファイルに、必要なカラムを追記していく形ではうまくできなかったため、新しくマイグレーションファイルを作成する。
rails g migration AddColumnToUsers
今回は、名前用のstring
型name
カラムや、自己紹介用のtext
型biography
カラムなどを追加したい。
def change add_column :users, :name, :string, null: false, default: "" add_column :users, :biography, :text end
ここでのdefault: ""
は、空白をデフォルトで入れるための制約。
追加したいカラムを書き終えたらマイグレーションを実行。
実際にカラムが追加されたかどうかをコンソールで確認してみる。
rails c
を実行後、User.column_names
。
追加したはずのカラムの名前があればOK。
今のままではDBにデータが保存されない。
最後に追加したカラムをDBへ反映させるために、strong parameters
の設定を行う。
<Ruby on Rails> deviseを用いてカラムを追加した時のコントローラー修正 - おーしまブログ
app/controllers/application_controller.rb
に記述していく。
devise_parameter_sanitizer
という、paramsのような役割を持つメソッドを利用する。
第一引数にはdeviseの処理名
を記述する。以下の三種類。
sign_in
... ログインの処理を行う時:sign_up
... 新規登録の処理を行う時:account_update
... アカウント情報更新の処理を行う時
新規登録の時に、name
を許可する場合は以下のようにする。
before_action :configure_permitted_parameters, if: :devise_controller? private def configure_permitted_parameters devise_parameter_sanitizer.permit(:sign_up, keys: [:name]) end end
複数指定したい場合は、keys
の部分をカンマで区切って記述していく。
devise_parameter_sanitizer.permit(:account_update, keys[:name, :biography])
[Rails5]Deviseでsign up時に任意のカラムを入力必須にしたい | ゆるりテックブログ
devise_parameter_sanitizerメソッドについて - Qiita
これで、登録時や情報更新時にカラムの値を更新することを許可できる。
password_confirmationは不要
テーブル設計段階では、password
と確認用のpassword_confirmation
カラムを作成する予定だったが、devise
にあるencrypted_password
が両方の役割を担ってくれているようだ。
パスワードリセット用カラム
パスワードリセット時に用いるつもりだった以下のカラムもdevise
側が既に用意してくれている。
reset_password_token
:string
型reset_password_sent_at
:datatime
型
ruby on rails devise encrypted_passwordカラム|レイキ・ITのすゝめ
学習メモ
作成したテーブルを削除
マイグレーションしようとすると、以下のようなエラーが出た。
Mysql2::Error: Table 'users' already exists
usersテーブルが重複してしまうため、マイグレーションできないとのこと。既に作成してしまったusersテーブルを削除することで解決した。
【解決方法】Mysql2::Error: Table 'users' already exists - Qiita
rails c でコマンドを実行するとエラー
rails c
をしたところ、MySQLでエラーが発生した。
ActiveRecord::ConnectionNotEstablished: Access denied for user 'root'@'localhost' (using password: NO)
とあり、ちゃんとユーザー名もパスワードも環境変数で登録してあるはずなのになぜかエラーが出てしまう。
結論として、database.yml
のproduction
におけるusername, passwordの部分を置き換え忘れていたからだった。
同じようなエラーが起こり、設定したはずなのにと思ったらもう一度database.yml
でちゃんと設定できているか確認するようにしたい。
複数のバリデーションを一つにまとめる
with_optionsで複数のバリデーションをまとめる - Qiita
多くのカラムに対して、presence: true
のバリデーションを設けたい場合は以下のように書くことで簡潔に記述できる。
with_options
を使用する
with_options presence:true do validates :name validates :text ... ... end
また、アソシエーションの関連付けのときに利用するhas_many
もwith_option
を使用してまとめて記述ができる。