Bye Bye Moore

PoCソルジャーな零細事業主が作業メモを残すブログ

strong_parameterで安全にparamを渡す

carrierwaveの自動生成スクリプトをみてたらこんな記述が...

  # Never trust parameters from the scary internet, only allow the white list through.
    def picture_params
      params.require(:picture).permit(:image)
    end

これはstrong_parameterという奴で、Rails4から標準実装されています。

今迄は変なparamを仕込んでおく事でアレ気な挙動をさせられてしまう懸念がありました。
このstrong_parameterが標準となった事で、特定のパラメータ以外を渡した場合、400を吐いて拒否するようにできます。

使い方

一つのモデルへ複数のパラメータを渡したい場合、複数行に書きます。

Private
def check_params
  params.require(:token)
  params.require(:post).permit(:title)
end

外部APIから来たデータを活用する場合は
受け取ったデータをActionController::Parametersのインスタンスとして変換する方式をとるようです。

raw_parameters = { :email => "john@example.com", :name => "John", :admin => true }
parameters = ActionController::Parameters.new(raw_parameters)
user = User.create(parameters.permit(:name, :email))

strong_parameterで扱われるparamは全部載せになります。
単にフラグとして使ってるだけのparam場合はメソッドを分けます。

Private
def picture_params
  params.require(:picture)
end

def flag_params
  params.require(:post).permit(:title)
end