Ruby
RubyOnRails
strong_parameters

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のレコードが変更されることを防ぐことができるのです。

以上!

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