params
コードの中でよく見る単語です。
Railsチュートリアルをする中でも、paramsが頻出するわけですが、やっているうちにこの「params」が何かわからなくなってきたので、「params」について考えてみます。
paramsとは’parameters(パラメータ)’
辞書的には ’ 変数 ’
ITでは ’ 外から入ってくる値 ’
Ruby on Railsではparamsはユーザーから送られてきた情報を受け取ります。(他の言語は調べていないのでRailsではと表現しています)
例:
・ユーザー登録画面で送られてくるユーザー名( params[:user] )、メールアドレス( params[:email] )
def show
@user = User.find(params[:id])
end
「 params 」の中身
例えば送られてきた情報を使って、新規ユーザーを登録するアクションを実装する時
def create
@user = User.new(params[:user])
@user.save
end
このコードは
「①ユーザー登録画面から送られてきたデーターをparamsとして受け取り、新しくユーザーを作成。②そのユーザーを保存する」というものですが、
一行目の
@user = User.new(params[:user])
は
@user = User.new(name: "maeda", email: "foo@example.com", password: "foo", password_confirmation:"foo")
と同じ内容です。
※params[:user]の[:user]は何やねんって話ですが、これは登録画面のコードで「form_with」ヘルパーでmodelにモデルオブジェクトを入れているため、[:user]としています
<%= form_with(model: @user, local: true) do |f| %>
更にもう一つ例をとって考えてみます。
Railsチュートリアルで
「ログインして、セッション情報を保持して、ログインを維持するという機能を実装」
する時にもparamsが出てきます。
def create
@user = User.find_by(email: params[:session][:email].downcase)
・
・
・
end
<%= 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とは まとめ
「外部から送られてきた情報受取るメソッド」
です。
新規登録画面でも、ログイン画面でも、それこそパスワード再設定画面でも送られてきた情報を受取るためのメソッドということ。
イマイチわからなかった理由は「form_withヘルパー」と「params」の関係性をよく理解していなかったからか。
ちょっとまった!!POSTはわかった。GETは?
たとえば上の方でいっていた
ユーザーの詳細画面を見る「show」アクション
これはHTTPプロトコルの「POST」ではなく「GET」でリクエストが来る。
def show
@user = User.find(params[:id])
end
このparams[:id]はなんなのか。
「GET」の場合
RailsではURL形式でパラメーターURLに含めてリクエストを送る。
たとえば
https://example/users/show/1
というURLにアクセスするとshowアクションが動きます。
※Railsのルーティング設定によるが、特にいじらず
Rails.application.routes.draw do
resources :users
end
としている場合のshowアクションへのルーティングは
Rails.application.routes.draw do
get 'users/:id', to:'users#show'
end
こうなっているはず。
この状態ではURLに含まれている「1」という値をパラメータ名「id」として取得できる。
つまり
def show
@user = User.find(params[:id])
end
は
def show
@user = User.find(1)
end
と同じ意味になるというわけです。
マスアサインメント
「params」を調べていると
「マスアサインメント」というものが出てきます。
ここまでまとめておきたい。
上のユーザーの新規作成のcreateアクション
def create
@user = User.new(params[:user])
@user.save
end
ここでの
@user = User.new(params[:user])
はマスアサインメントと言います。
railsでは更新系の処理(new / updateなど)は複数のカラムを一括で指定できる。
※上のコードは下記と同義で、複数のカラムを指定している
@user = User.new(name: "maeda", email: "foo@example.com", password: "foo", password_confirmation:"foo")
便利ではあるが、無条件にすべてのフィールドを書き換えられてしまう危険性がある。(マスアサインメントの脆弱性)例えば管理者権限を奪われたりしちゃう。
そのための対策が必要になり、Storong Parametersというものがでてきます。
Storong Parameters
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チュートリアル