2
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Posted at

params

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

paramsとは’parameters(パラメータ)’

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


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

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

ユーザー詳細情報を見るためにDBから情報を検索する
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が出てきます。

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

ログイン画面 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とは  まとめ

「外部から送られてきた情報受取るメソッド」

です。

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

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

ちょっとまった!!POSTはわかった。GETは?

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

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

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

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


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

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


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

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

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

routes.rb
Rails.application.routes.draw do
  get 'users/:id', to:'users#show'
end

こうなっているはず。


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

つまり

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

ユーザー詳細情報を見るためにDBから情報を検索する
def show
 @user = User.find()
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チュートリアル

2
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?