唯一の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
これらのフィールドは 'nil'、ない'「」 'しているので、' scrub_params'が実際に正しくここで働いています。 – Dogbert
あなたは正しいです。私は誤って 'scrub_params'が空のパラメータを削除すると考えました。 –