Edited at

StrongParameterって何??

More than 1 year has passed since last update.


RailsのStrong Parameterって何?


経緯

後輩に聞かれたので自分の復習も兼ねて記事にまとめてみたいと思います。


Strong Parameter ??

strong_parametersとは簡単に言うとRailsに備わっているパラメーターとして受け取る値を制限する仕組みのことです。


Strong Parameter使わないとどうなるの??

例えば、次のようなアプリケーションを考えてみてください。


hoges_controller.rb

class HogesController < ApplicationController

def create
@hoge = Hoge.new(params)
@hoge.save
end
end

hogeモデルの中身


create_hoge.rb

class CreateHoge < ActiveRecord::Migration

def change
create_table :hoges do |t|
t.string :hoge

t.timestamps
end
end
end


このようなJSON APIを作るとします

このときフロントエンドからは次のようなjsonが帰ってくるとします。


response.json

{

"hoge": {
"id": 2,
"hoge": "hogehoge"
}
}

このときhoges_controllerではどのような処理がなされるでしょうか?

paramsの中身は


params.rb

{ hoge: {id: 2, hoge: "hogehoge"} }


になります

しかし、このときid(primaryKey)を指定されているためdbに保存するときにidが2のレコードがあるとidが重複したレコードができてしまいます。

また、updateのときidを加えてしまうとdbに保存されている違うhogeの中身を書き換えることも可能となってしまいます。


何が問題なの??

先程のupdateで考えて見ましょう。

webアプリケーションでのユーザーを考えて見てください。

Userをupdateするときに


users_controller.rb

def update

@user = user.find(params[:id])
@user.update(params)
end

としてしまうとjsonでidを指定してしまえば他のユーザーのパスワードや名前の書き換えが可能となってしまいます。


どうすればいい??

Strong Parametersを使いましょう!! 

例えば上記のhoges_controllerを次のように変更すれば、、、


hoges_controller.rb

class HogesController < ApplicationController

def create
@hoge = Hoge.new(hoge_params)
@hoge.save
end

def hoge_params
params.require(:hoge).permit(:hoge)
end
end


paramsの中身で:hoge意外の要素を弾くことができます。

こうすることによって外部のユーザーがjsonを送ることによってDBのレコードが変更されることを防ぐことができるのです。

以上!

恐らく多々勘違いしている部分があると思いますが、あればご指摘して頂ければ幸いです。