プログラミング備忘録

プログラミングの学習状況をメモしています

84日目

今日の学習

Ruby on Rails

devise

作成したUserモデルにカラムを追加

初めてのdevise ② -- カラムを追加してみる -- ~ やってみようカスマイズ! ~ - Qiita

gem deviseで作成したモデルにはemailpasswordカラムしかない。

Userモデルに他のカラムも追加したい場合はどうすればいいか、調べた過程をメモ。

まず、以下のコマンドを実行する。

rails g devise User

作成されたdb/migrate/***(日付)_devise_create_users.rbファイルに、必要なカラムを追記していく形ではうまくできなかったため、新しくマイグレーションファイルを作成する。

rails g migration AddColumnToUsers

今回は、名前用のstringnameカラムや、自己紹介用のtextbiographyカラムなどを追加したい。

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.ymlproductionにおけるusername, passwordの部分を置き換え忘れていたからだった。

同じようなエラーが起こり、設定したはずなのにと思ったらもう一度database.ymlでちゃんと設定できているか確認するようにしたい。

複数のバリデーションを一つにまとめる

with_optionsで複数のバリデーションをまとめる - Qiita

多くのカラムに対して、presence: trueのバリデーションを設けたい場合は以下のように書くことで簡潔に記述できる。

with_optionsを使用する

with_options presence:true do
  validates :name
  validates :text
...
...
end

また、アソシエーションの関連付けのときに利用するhas_manywith_optionを使用してまとめて記述ができる。

Railsのwith_options - Qiita