2017-01-04 10 views
0

強いパラメータで特定の値のハッシュまたはnilの値のいずれかを許可しようとしています。私は今、次があります。強力なパラメータでハッシュまたはnilを許可する

params.require(:parent).permit(child: [:attr1, :attr2]) 

私はこのアクションを呼び出す場合:Railsは子パラメータを許可しない

{ "parent": { "child": nil }} 

。 (Unpermitted parameter: child

nilとハッシュが両方とも許可されていることをどのようにしてレールに伝えますか?

params.require(:parent).permit(:child, child: [:attr1, :attr2]) 

しかしこれによっても文字列値が許可されます。この、でもゼロを通して何かを許可する必要があり

params.require(:parent).permit(:child) 

が、その後、独自のカスタムを書くことでタイプをチェック:

+0

ハッシュ入力を許可しようとしているのですか、またはネストされたリソースを受け入れようとしていますか?これらは非常に異なるユースケースです – TheRealMrCrowley

答えて

2

ここで行うための最善のことは、私が思うに、これを行うことによって、すべての値をできるようにすることです検証。

validate :child_is_nil_or_hash 
... 
def child_is_nil_or_hash 
    unless child.is_a?(Hash) || child.nil? 
    errors.add(:child, 'must be nil or a hash') 
    end 
end 

またはそれに相当するもの。私はこのコードを適切にテストしていません。

この例では、検証の責任をパラメータのホワイトリストから離れて、それが属しているRailsバリデーションに移動します。

+0

これは 'params.require(:parent).permit(:child、child:[:attr1、:attr2])'と全く同じソリューションです。ハッシュ。 – Roy

+0

@Roy:解決策を見つけましたか? – thiebo

+0

@Royこれは正解です。強力なパラメータは、どのようなキーが許可されるべきかを設定することです。それはまったく危険な方法ではありません。その鍵に許可されているものの妥当性検証は、それが想定されるモデル検証にあります。彼が上に掲載したコードでは、ハッシュ入力またはnil以外のeveythingはエラー – TheRealMrCrowley

関連する問題