2013-11-23 18 views
34

私はコントローラIDに配列foo_idsを送信しています。値の配列を可能にするために、私が使用します。Rails - 空の配列を持つ強力なパラメータ

params.permit(foo_ids: []) 

さて、問題は、私はfoo_idsの空の配列を送信する場合、パラメータは無視されていることです。空の配列として行うすべてのfoosを消去する代わりに、foo_idsは許可されていないため、関連付けはそのままの状態になります。

an empty array is converted to nil in railsが原因である可能性があります。強いパラメータが単一のスカラー値ではなく、スカラー値の配列を探しているので、この値は無視されます。

誰もこれを解決する良い方法を提案できますか?ありがとう!更新コントローラのアクションで

追加情報

、私は2つのケースを処理できるようにする必要があります。 foo_idsを空の配列に設定する必要があります。私はまた、単に別のフィールドを更新したい場合はfoo_idsを無視する必要があります。この2番目のケースでnilが機能しない場合は、foo_idsを空の配列に設定します。

答えて

18

私がダウン来ている一時的な解決策は以下のとおりです。ここで

params[:foo_ids] ||= [] if params.has_key?(:foo_ids) 
params.permit(foo_ids: []) 

は、foo_idsが渡された場合にのみ、空の配列に設定されています。要求に渡されない場合は無視されます。

私はまだ、このようなことが、私が取り組んでいるプロジェクトではかなり一般的になるので、より良い解決策を見つけることを望んでいます。

+0

に。思考? – futbolpal

+1

それはうまくいくでしょう。私はハッシュの中にネストされたパラメータに対してこれを行う必要があったいくつかのケースを持っていたので、あなたの使い方に応じてそれらを扱いたいかもしれません。 –

28

これはかなり遅いですが、私はちょうどこの問題を自分で持っていました。それが同じpermitステートメントの両方を持っているを持っています - - あなたがそれらをチェーン場合、それが得られますFYI

params.require(:photo).permit(:tags, tags: []) 

:私はそうのように、permitステートメントでスカラーバージョンと配列バージョンの両方を含むことによってそれを解決しました何らかの理由で投げ捨てられた。

編集:私は、このメソッドを介して送信された空の配列がnilに変わることに気付きました。空の配列がnilであるはずのフィールドがたくさんあります。だから私が投稿したソリューションは実際に私のために働いていない。

EDIT the second:私はすでにこれを追加していたと思っていますが、この問題はparamsハッシュでdeep_mungeを実行しているRailsに関連しています。このコメントは、それを修正する方法を説明しています:https://stackoverflow.com/a/25428800/130592

0

私は最近同じ問題を抱えていましたが、ここでの答えはどれも私のために働いていませんでした。これが私の解決です。 javascriptでHTTPリクエストを処理している場合は、これもうまくいく可能性があります。

クライアント側で

:私は「_ids」で終わるすべてのキーのためにこれに対処するために何かをするだろうモンキーパッチのbefore_filterを検討していた

if (photo.tags.length === 0){ 
    photo.tags = ["null"] 
} 

そして、あなたをPhotosController

def photo_params 
    p = params.require(:photo).permit(tags: []) 
    p["tags"].reject! { |tag| tag == "null" } 
    p 
end 
関連する問題