2013-04-26 2 views
5

強力なパラメータを使用して、必要に応じてハッシュの単一の属性をマークすることは可能ですか?標準強いのparams例がある属性を必要とする強いパラメータ

{ 
    "example" => { 
    "optional": 1234, 
    "required": 5678 
    } 
} 

params.require(:example).permit(:optional, :required)

あなたが特定のパラメータを必要とすることができることを考えると、私は次のように働くだろうと思った:

params.require(:example).require(:required) 
params.require(:example).permit(:optional) 
のような入力を考えると

私は試みました:

params.require(:example => [ :required ]).permit(:optional) 
params.require(:example).permit(:optional) 
params[:example].require(:required) 

他にも私は考えることができます。

誰でも可能ですか?

答えて

5

Greg!

私は同じ質問をしましたが、結局のところ、それは適切な質問ではありませんでした。

def require(key) 
    self[key].presence || raise(ActionController::ParameterMissing.new(key)) 
end 

だから、基本的には、paramsハッシュで「必要」属性を要求する方法はありません。

ルックは、ここstrong_parameters宝石のメソッド必要のソースコードです。しかし、それを別の側から見てください。私はそれを行うためには、あなた自身のメソッドを必要とする方がよいと思います。レールを使用しているので、モデルにvalidates_presence_ofを追加したばかりです。動的にしたい場合は、カスタム検証を作成することができます。あなたはここでそのドキュメントを見つけることができます。

http://guides.rubyonrails.org/v3.2.13/active_record_validations_callbacks.html#performing-custom-validations

+0

ありがとうございます。私は同じ結論に達しました。私の場合、プレゼンス要件はリソースへのアクセス方法(つまりコントローラ経由)に条件がありますが、これを助けるための条件付き検証をいくつか行うことができました。 –

0

をあなたは何ができるか:exampleが欠落している場合、最初の行が失敗した

def example_params 
    params.require(:example) 
    params[:example].require(:required) 
    params.require(:example).permit(:required, :optional) 
end 

を使用しています。 :example:requiredがない場合、2行目は失敗します。 3行目は期待通りの結果を返しますが、:optionalを許可します。

関連する問題