【Ruby on Rails】 ストロングパラメータについて調べてみた

#はじめに
ストロングパラメータについて調べたので備忘録として記事にしました。

###対象読者
プログラミング勉強始めたての方。

###題材
自分のポートフォリオのUserオブジェクト周りを題材としています。

#ストロングパラメータとは
ユーザー登録フォームなどによって送られてきた情報を限定して取得し、データベースに一気に保管出来るようにした処理のことです。なぜ、情報を限定するかというとユーザー側にいじって欲しくない情報をデータベースに保存させないようにするためです。
例えば管理者情報などをいじられて勝手に管理者にならないようにしています。
また、複数カラムにデータを保存できるようにする役割もあります。
実際に設定しているものがこちらです。

```ruby:app/controllers/users_controller.rb
def create
    @user = User.new(user_params)
    if @user.save
      log_in @user
      flash[:success] = 'ユーザー登録完了'
      redirect_to root_url
    else
      render 'new'
    end
  end

private

  def user_params
    params.require(:user).permit(:name, :email, :password,
                                 :password_confirmation)
```

基本的にはコントローラーのprivate内(カプセル化)で定義し、create等のアクション渡します。（private内に定義する理由はこのコントローラないでしか参照しない、コードがすっきりするからです。）

ストロングパラメータ内では3つのメゾットが定義されておりそれぞれに以下のような役割があります。

params:フォームなどで送られてきたメゾットを取得
require:送られてくる値が二次元ハッシュのときに使い引数に渡されたものがキーとなっているもののみ取得する。
permit:引数に渡されたもののみデータベースに保存するのを許可する。

#paramsについて
送られてきたメゾットを取得します。
フォームからのpostメゾットや検索フォームなどのgetメゾットでURLのクエリに入るデータがparamsで取得できるデータです。
※検索機能についてはこちら
https://qiita.com/E6YOteYPzmFGfOD/items/dc1ab3c19d4718a0edc8
実際に新規ユーザーを登録する時にはこんな感じでフォームからコントローラへ送られます。

```
Parameters: {"utf8"=>"✓", "authenticity_token"=>"OSab8g1vpkYUMQI74VcZX08Ci82gTPxBCK/
YOZ766OzRmPuM/pYW5+ZX8gh/l+87UPpag69De8f+NjhCs+SqmA==", 
"user"=>{"name"=>"test", "email"=>"foo@bar.com", "password"=>"[FILTERED]", "password_confirmation"=>
"[FILTERED]"}, "commit"=>"作成"}
```
パラメータを取り出す際はこのように指定すれば取り出せます。

```
params[:user]
<ActionController::Parameters {"name"=>"test",
 "email"=>"foo@bar.com", "password"=>"123456",
 "password_confirmation"=>"123456"} permitted: false>

params[:user][:name]※二次元ハッシュ　キーのnameにさらにuserがキーになっている。
"test"
```
このようにして値を取り出せますが、このままcreateメゾットに渡してもエラーになります。

```ruby:app/controllers/users_controller.rb
def create
    @user = User.new(user_params)※エラーになる。
```

なぜエラーになるのかというと先ほどパラメータで取得した値の中に「permitted: false」とありますがこれがfalseになっているせいです。primittedはマスアサイメント機能を許可する部分になります。マスアサイメントとはdbに値を保存する時に複数のカラムを一括で指定できる機能になります。これをtrueにかえるのがpermitメゾットです。

#permit
実際にpermitでdbに保存する値を限定することによってpermitがtrueになります。
※まさにストロングパラメータの形です。

```
params[:user]
<ActionController::Parameters {"name"=>"test",
 "email"=>"foo@bar.com", "password"=>"123456",
 "password_confirmation"=>"123456"} permitted: false>

params.require(:user).permit(:name,:email,:password,:password_confirmation)
<ActionController::Parameters {"name"=>"test",
 "email"=>"foo@bar.com", "password"=>"123456",
 "password_confirmation"=>"123456"} permitted: true>
```
これでpermitted: trueになったのでストロングパラメータで取得したものをcreateアクションに渡すことで複数カラムに情報を保存できるようになりました。

#requireについて
このメゾットは値が二次元ハッシュで送られる時（post）に必要となり、引数に渡したキーの値だけを取得できるようになります。

```
params
<ActionController::Parameters {"utf8"=>"✓",
"authenticity_token"=>"OSab8g1vpkYUMQI74VcZX08Ci82gTPxBCK/YOZ766OzRmPuM/pYW5+ZX8gh/l+87UPpag69De8f+NjhCs+SqmA==",
 "user"=><ActionController::Parameters {"name"=>"test",
 "email"=>"foo@bar.com", "password"=>"123456",
 "password_confirmation"=>"123456"} permitted: false>,
 "commit"=>"作成", "controller"=>"users",
 "action"=>"create"} permitted: false>

params.require(:user)
<ActionController::Parameters {"name"=>"test",
 "email"=>"foo@bar.com", "password"=>"123456",
 "password_confirmation"=>"123456"} permitted: false>
```

#最後に
ここまでお付き合いいただきありがとうございました。
また、何か気になったことがあれば記事にしたいと思います。
間違い等コメントいただけると幸いです。
それではありがとうございました。