2016-07-22 6 views
0

私のチームの一人が、ユーザーがフォームに「必須」入力を提出したことを検証するためにActionController :: Parameters#強力なパラメータを使用するには、必要なフォーム属性の検証が必要です

ActiveRecordモデルとは別にエラーを処理しなければならないので、私にとってはうまくいきません(存在:真)。

たとえば、名前、年齢、および:zip_codeのユーザーがいるとします。そして:名前と:年齢が必要です。はるかにきれいですpresence: trueのようなこの目的とモデルの検証のために設計されていない強力なパラメータのように思える、私にとって

def user_params 
    params.require(:user).require(:name) 
    params.require(:user).require(:age) 
    params.require(:user).permit(:zip_code) 
end 

は、彼のようなものを望んでいます。

良い習慣とは何でしょうか?なぜ1つを使用し、他のものを使用しないのですか?

答えて

1

モデル検証はこれとは全く異なります。フィールドで許可されている値、必須フィールドは何かなどを実装するためのモデル検証があります。ビジネスロジックの面ではさらに重要です。しかし、強力なパラメータはセキュリティ対策です。

強力なパラメータは、ユーザーがデータベース内の不要なフィールドを更新できないようにするためです。アプリケーションがデータベース内のどのフィールドを更新できるかを決めるセキュリティ対策です。たとえば、テーブルに名前、年齢、zip_code、login_attemptがあるとします。 login_attemptは、失敗したログイン試行の回数を数えます。強力なパラメータがなく、ユーザーの変更を次のように保存すると、ユーザーは簡単にlogin_attemptフィールドも更新できます。このレールが強力なパラメータを持つことを防ぐためにInorder。したがって、不要なフィールドをテーブルに更新するための脆弱性はありません。許可されていないフィールドを更新しようとすると、このForbiddenAttributesErrorが発生します。これを行う正しい方法は、次のとおりです。

def allowed_params 
    params.require(:user).permit(:name, :age, :zip_code) 
end 

@user = User.new(allowed_params) 
@user.save 
関連する問題