RailsのStrong Parameterって何?
経緯
後輩に聞かれたので自分の復習も兼ねて記事にまとめてみたいと思います。
Strong Parameter ??
strong_parametersとは簡単に言うとRailsに備わっているパラメーターとして受け取る値を制限する仕組みのことです。
Strong Parameter使わないとどうなるの??
例えば、次のようなアプリケーションを考えてみてください。
class HogesController < ApplicationController
def create
@hoge = Hoge.new(params)
@hoge.save
end
end
hogeモデルの中身
class CreateHoge < ActiveRecord::Migration
def change
create_table :hoges do |t|
t.string :hoge
t.timestamps
end
end
end
このようなJSON APIを作るとします
このときフロントエンドからは次のようなjsonが帰ってくるとします。
{
"hoge": {
"id": 2,
"hoge": "hogehoge"
}
}
このときhoges_controllerではどのような処理がなされるでしょうか?
paramsの中身は
{ hoge: {id: 2, hoge: "hogehoge"} }
になります
しかし、このときid(primaryKey)を指定されているためdbに保存するときにidが2のレコードがあるとidが重複したレコードができてしまいます。
また、updateのときidを加えてしまうとdbに保存されている違うhogeの中身を書き換えることも可能となってしまいます。
何が問題なの??
先程のupdateで考えて見ましょう。
webアプリケーションでのユーザーを考えて見てください。
Userをupdateするときに
def update
@user = user.find(params[:id])
@user.update(params)
end
としてしまうとjsonでidを指定してしまえば他のユーザーのパスワードや名前の書き換えが可能となってしまいます。
どうすればいい??
Strong Parametersを使いましょう!!
例えば上記のhoges_controllerを次のように変更すれば、、、
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のレコードが変更されることを防ぐことができるのです。
以上!
恐らく多々勘違いしている部分があると思いますが、あればご指摘して頂ければ幸いです。