ストロングパラメーターの理解が難しいので一度整理します。
1.ストロングパラメーターとは
Web上で受け取ったパラメーター(変数)が安全かどうかを検証したうえで取得する仕組み。
安全ではない(意図しない)データの登録や更新を未然に防ぐことができる。
2.仕組み
メソッドにあらかじめ許可するカラムを指定しておく。
3.対象のデータ
ユーザーがフォームから入力した内容。
(viewから送られてきた情報)
4.対象の機能
登録・更新機能。
(コントローラー上で定義されたcreate.updateメソッド)
5.deviseを使った場合とそうでない場合を整理
deviseを使っていない場合
コントローラーにストロングパラメーターを記述。
permitメソッドを使って許可するキー(カラム名)を記述する。
private
def user_params
params.require(:user).permit(:email, :nickname)
end
上記の場合、Userモデルに存在するemailカラムとnicknameカラムの情報を許可する。他のカラムに関しては許可しない。
deviseを使った場合
class DeviseCreateUsers < ActiveRecord::Migration[7.0]
def change
create_table :users do |t|
## Database authenticatable
t.string :email, null: false, default: ""
t.string :encrypted_password, null: false, default: ""
t.string :name
t.text :profile
t.text :position
t.integer :user_id
## 略
end
end
Gem内に処理が記述されているのでコントローラーを編集できないためapplication_controllerに記述する。
permit(:処理名, keys: [:許可するカラム名])
処理名にはもとから設定されているsign_in, sign_up, account_updateがある。
before_actionで各アクションの事前に処理をする記述をする。
if: :devise_controller?でコントローラーに関するアクションが処理された時に実行する設定。
before_action :configure_permitted_parameters if: :devise_controller?
private
def configure_permitted_parameters
devise_parameter_sanitizer.permit(:sign_up, keys: [:name, :profile])
end
end
モデルではname,profile,positionカラムが追加されているが、今回許可されているのはnameとprofileのみとなる。
また、emailとpasswordはあらかじめ備わっているので追加する必要はない。