2017-10-24 4 views
0

唯一の1/5のオプションが必要なネストされたフォームがあります。しかし、ユーザーが1つのネストされたフォームのみを記入してフォームを送信すると、Ectoはその変更セットを無効として返します。embeds_manyを使用しているときに空のネストされたフォームを削除する

私はscrub_paramsプラグをコントローラに追加しましたが、空のネストされたフォームは削除されないようです。

空のフォームを削除する方法はありますか?


コネティカットのParamsのparams [ "在庫"]:

%{"payment_invoice_type" => "mail", 
    "delivery_methods" => 
    %{"0" => %{"cost" => "10.00", "description" => "Del Option 1"}, 
    "1" => %{"cost" => "20.00", "description" => "Del Option 2"}, 
    "2" => %{"cost" => "30.00", "description" => "Del Option 3"}, 
    "3" => %{"cost" => nil, "description" => nil}, # should be discarded 
    "4" => %{"cost" => nil, "description" => nil}}, # should be discarded 
    "payment_method" => "cash", 
} 

チェンジの結果:

#Ecto.Changeset<action: nil, 
changes: %{payment_invoice_type: "mail, 
    delivery_methods: [#Ecto.Changeset<action: :insert, 
    changes: %{cost: #Decimal<10.00>, description: "Del Option 1"}, errors: [], 
    data: #Book.Store.ShippingMethod<>, valid?: true>, 
    #Ecto.Changeset<action: :insert, 
    changes: %{cost: #Decimal<20.00>, description: "Del Option 2"}, errors: [], 
    data: #Book.Store.ShippingMethod<>, valid?: true>, 
    #Ecto.Changeset<action: :insert, 
    changes: %{cost: #Decimal<30.00>, description: "Del Option 3"}, errors: [], 
    data: #Book.Store.ShippingMethod<>, valid?: true>, 
    #Ecto.Changeset<action: :insert, changes: %{}, 
    errors: [description: {"can't be blank", [validation: :required]}, 
     cost: {"can't be blank", [validation: :required]}], 
    data: #Book.Store.ShippingMethod<>, valid?: false>, 
    #Ecto.Changeset<action: :insert, changes: %{}, 
    errors: [description: {"can't be blank", [validation: :required]}, 
     cost: {"can't be blank", [validation: :required]}], 
    data: #Book.Store.ShippingMethod<>, valid?: false>], 
    payment_method: "cash"}, 
errors: [], 
data: #Book.Store.Inventory<>, valid?: false> 

親スキーマ:

スキーマ "在庫" が フィールドの操作を行います。payment_invoice_type 、:文字列 フィールド: PAYMENT_METHOD、:文字列 embeds_many:shipping_options、Book.Store.ShippingOptions タイムスタンプ() 終了

親チェンジ:

def changeset(%Inventory{} = inventory, attrs) do 
    inventory 
    |> cast(attrs, [:payment_invoice_type, :payment_method]) 
    |> validate_required([:payment_invoice_type, :payment_method]) 
    |> cast_embed(:shipping_methods, required: true) 
end 

組み込みスキーマ:私はないと思う

@primary_key false 
    embedded_schema do 
    field :description, :string 
    field :cost, :decimal 
    end 

    def changeset(%DeliveryOption{} = delivery_option, attrs) do 
    delivery_option 
    |> cast(attrs, [:description, :cost]) 
    |> validate_required([:description, :cost]) 
    |> validate_length(:description, min: 5, max: 75) 
    end 
+1

これらのフィールドは 'nil'、ない'「」 'しているので、' scrub_params'が実際に正しくここで働いています。 – Dogbert

+0

あなたは正しいです。私は誤って 'scrub_params'が空のパラメータを削除すると考えました。 –

答えて

0

そのようなエントリをEcto内で自動的に削除する方法。手動で次のようにかなり容易エントリを削除することができます

inventories = Map.update!(inventories, "delivery_methods", fn map -> 
    :maps.filter(fn _key, value -> !match?(%{"cost" => nil, "description" => nil}, value), map) 
end) 

これはnilの両方costdescriptionセットを持っているすべてのdelivery_methods値を削除します。

また、以下はnilに設定されているすべてのそれらの値を持つすべてのエントリを削除します:

inventories = Map.update!(inventories, "delivery_methods", fn map -> 
    map |> Map.values |> Enum.all?(&is_nil/1) 
end) 
+0

フィルタリングフォームとX個のフォームがレンダリングされることを保証することは、Ectoライブラリの本当の問題です。 –

関連する問題