Railsチュートリアルでよく見る「params」とは何か？を考える。

params

コードの中でよく見る単語です。
Railsチュートリアルをする中でも、paramsが頻出するわけですが、やっているうちにこの「params」が何かわからなくなってきたので、「params」について考えてみます。

paramsとは’parameters（パラメータ）’

辞書的には ’ 変数 ’
ITでは ’ 外から入ってくる値 ’

---
Ruby on Railsでは<strong>paramsはユーザーから送られてきた情報を受け取ります。</strong>（他の言語は調べていないのでRailsではと表現しています）

例：
・ユーザー登録画面で送られてくるユーザー名（ params[:user] ）、メールアドレス( params[:email] )


```ruby:ユーザー詳細情報を見るためにDBから情報を検索する
def show
 @user = User.find(params[:id])
end
```

#「 params 」の中身
例えば送られてきた情報を使って、新規ユーザーを登録するアクションを実装する時

```ruby
def create
 @user = User.new(params[:user])
 @user.save
end
```
このコードは
「①ユーザー登録画面から送られてきたデーターをparamsとして受け取り、新しくユーザーを作成。②そのユーザーを保存する」というものですが、

一行目の

```ruby
@user = User.new(params[:user])
```

は

```ruby
@user = User.new(name: "maeda", email: "foo@example.com", password: "foo", password_confirmation:"foo")
```

と同じ内容です。

---
※params[:user]の[:user]は何やねんって話ですが、これは登録画面のコードで「form_with」ヘルパーでmodelにモデルオブジェクトを入れているため、[:user]としています

```ruby
<%= form_with(model: @user, local: true) do |f| %>
```
---



更にもう一つ例をとって考えてみます。

Railsチュートリアルで
「ログインして、セッション情報を保持して、ログインを維持するという機能を実装」
する時にもparamsが出てきます。

```ruby:sessions_controller.rb
  def create
    @user = User.find_by(email: params[:session][:email].downcase)
　　・
　　・
　　・
  end

```

```ruby:ログイン画面　views/sessions/new.html.etb
 <%= form_with(url: login_path, scope: :session, local: true) do |f| %>
 <%= f.label :email %>
 <%= f.email_field :email , class: "form-control" %>
```

例えばログイン画面から送られてきたメールアドレスは

```
params[:session][:email] 
```
で受け取れる。

※params``[:session]``[:email]
なぜ[:session]なのかはform_withのscopeオプションを「session」にしているから。


#paramsとは　 まとめ
``「外部から送られてきた情報受取るメソッド」
``

です。

新規登録画面でも、ログイン画面でも、それこそパスワード再設定画面でも送られてきた情報を受取るためのメソッドということ。

<strong>イマイチわからなかった理由は「form_withヘルパー」と「params」の関係性をよく理解していなかったからか。</strong>


#ちょっとまった！！POSTはわかった。GETは？

たとえば上の方でいっていた
ユーザーの詳細画面を見る「show」アクション

これはHTTPプロトコルの「POST」ではなく「GET」でリクエストが来る。

```ruby:ユーザー詳細情報を見るためにDBから情報を検索する
def show
 @user = User.find(params[:id])
end
```

このparams[:id]はなんなのか。

---

「GET」の場合
RailsではURL形式でパラメーターURLに含めてリクエストを送る。

たとえば
``https://example/users/show/1``
というURLにアクセスするとshowアクションが動きます。

---
※Railsのルーティング設定によるが、特にいじらず

```ruby:routes.rb
Rails.application.routes.draw do
  resources :users
end
```

としている場合のshowアクションへのルーティングは

```ruby:routes.rb
Rails.application.routes.draw do
  get 'users/:id', to:'users#show'
end
```
こうなっているはず。

---

この状態ではURLに含まれている「１」という値をパラメータ名「id」として取得できる。

つまり

```ruby:ユーザー詳細情報を見るためにDBから情報を検索する
def show
 @user = User.find(params[:id])
end
```
は

```ruby:ユーザー詳細情報を見るためにDBから情報を検索する
def show
 @user = User.find(１)
end
```

と同じ意味になるというわけです。

https://qiita.com/em_maeda/items/035a8a52cb0e0837db98


#マスアサインメント
「params」を調べていると

「マスアサインメント」というものが出てきます。

ここまでまとめておきたい。

上のユーザーの新規作成のcreateアクション

```ruby
def create
 @user = User.new(params[:user])
 @user.save
end
```
ここでの



```ruby
 @user = User.new(params[:user])
 ```

はマスアサインメントと言います。

railsでは更新系の処理（new / updateなど）は複数のカラムを一括で指定できる。

---
※上のコードは下記と同義で、複数のカラムを指定している

```ruby
@user = User.new(name: "maeda", email: "foo@example.com", password: "foo", password_confirmation:"foo")
```
---

便利ではあるが、無条件にすべてのフィールドを書き換えられてしまう危険性がある。（マスアサインメントの脆弱性）例えば管理者権限を奪われたりしちゃう。

そのための対策が必要になり、<strong>Storong Parameters</strong>というものがでてきます。

#Storong Parameters

```ruby
def create
 @user = User.new(user_params)
 @user.save
end


private

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


```

これで脆弱性は守られます。

Strong Parametersに関してはもうちょっと調べて、また今度まとめることにします。







#参考
https://wa3.i-3-i.info/word1443.html
https://www.javadrive.jp/rails/controller/index6.html
https://qiita.com/tbpgr/items/63028f5e19a2d1617e40
[Railsチュートリアル](https://railstutorial.jp/)