I found possible bug with Ash.DataLayer.Mnesia in form validation

I'm writing the Tunez code using Mnesia, and I came across this difference.
form = AshPhoenix.Form.for_create(Tunez.Music.Artist, :create)

AshPhoenix.Form.validate(form, %{name: "Best Band Ever"}) # returning valid
#AshPhoenix.Form<
resource: Tunez.Music.Artist,
action: :create,
type: :create,
params: %{name: "Best Band Ever"},
source: #Ash.Changeset<
domain: Tunez.Music,
action_type: :create,
action: :create,
attributes: %{},
relationships: %{},
errors: [],
data: %Tunez.Music.Artist{
id: nil,
name: nil,
biography: nil,
inserted_at: nil,
updated_at: nil,
__meta__: #Ecto.Schema.Metadata<:built, "">
},
valid?: true
>,
name: "form",
data: nil,
form_keys: [],
forms: %{},
domain: Tunez.Music,
method: "post",
submit_errors: nil,
id: "form",
transform_errors: nil,
original_data: nil,
transform_params: nil,
prepare_params: nil,
prepare_source: nil,
raw_params: %{name: "Best Band Ever"},
warn_on_unhandled_errors?: true,
any_removed?: false,
added?: false,
changed?: false,
touched_forms: MapSet.new([:name]),
valid?: true,
errors: true,
submitted_once?: false,
just_submitted?: false,
...
>
form = AshPhoenix.Form.for_create(Tunez.Music.Artist, :create)

AshPhoenix.Form.validate(form, %{name: "Best Band Ever"}) # returning valid
#AshPhoenix.Form<
resource: Tunez.Music.Artist,
action: :create,
type: :create,
params: %{name: "Best Band Ever"},
source: #Ash.Changeset<
domain: Tunez.Music,
action_type: :create,
action: :create,
attributes: %{},
relationships: %{},
errors: [],
data: %Tunez.Music.Artist{
id: nil,
name: nil,
biography: nil,
inserted_at: nil,
updated_at: nil,
__meta__: #Ecto.Schema.Metadata<:built, "">
},
valid?: true
>,
name: "form",
data: nil,
form_keys: [],
forms: %{},
domain: Tunez.Music,
method: "post",
submit_errors: nil,
id: "form",
transform_errors: nil,
original_data: nil,
transform_params: nil,
prepare_params: nil,
prepare_source: nil,
raw_params: %{name: "Best Band Ever"},
warn_on_unhandled_errors?: true,
any_removed?: false,
added?: false,
changed?: false,
touched_forms: MapSet.new([:name]),
valid?: true,
errors: true,
submitted_once?: false,
just_submitted?: false,
...
>
1 Reply
matheuscamarques
matheuscamarquesOP3mo ago
AshPhoenix.Form.submit(form, params: %{name: "Best Band Ever"}) # returning invalid
{:error,
#AshPhoenix.Form<
resource: Tunez.Music.Artist,
action: :create,
type: :create,
params: %{name: "Best Band Ever"},
source: #Ash.Changeset<
domain: Tunez.Music,
action_type: :create,
action: :create,
attributes: %{},
relationships: %{},
errors: [
%Ash.Error.Changes.Required{
field: :name,
type: :attribute,
resource: Tunez.Music.Artist,
splode: Ash.Error,
bread_crumbs: [],
vars: [],
path: [],
stacktrace: #Splode.Stacktrace<>,
class: :invalid
}
],
data: %Tunez.Music.Artist{
id: nil,
name: nil,
biography: nil,
inserted_at: nil,
updated_at: nil,
__meta__: #Ecto.Schema.Metadata<:built, "">
},
valid?: true
>,
name: "form",
data: nil,
form_keys: [],
forms: %{},
domain: Tunez.Music,
method: "post",
submit_errors: [name: {"is required", []}],
id: "form",
transform_errors: nil,
original_data: nil,
transform_params: nil,
prepare_params: nil,
prepare_source: nil,
raw_params: %{name: "Best Band Ever"},
warn_on_unhandled_errors?: true,
any_removed?: false,
added?: false,
changed?: false,
touched_forms: MapSet.new([:name]),
valid?: false,
errors: true,
submitted_once?: true,
just_submitted?: true,
...
>}
AshPhoenix.Form.submit(form, params: %{name: "Best Band Ever"}) # returning invalid
{:error,
#AshPhoenix.Form<
resource: Tunez.Music.Artist,
action: :create,
type: :create,
params: %{name: "Best Band Ever"},
source: #Ash.Changeset<
domain: Tunez.Music,
action_type: :create,
action: :create,
attributes: %{},
relationships: %{},
errors: [
%Ash.Error.Changes.Required{
field: :name,
type: :attribute,
resource: Tunez.Music.Artist,
splode: Ash.Error,
bread_crumbs: [],
vars: [],
path: [],
stacktrace: #Splode.Stacktrace<>,
class: :invalid
}
],
data: %Tunez.Music.Artist{
id: nil,
name: nil,
biography: nil,
inserted_at: nil,
updated_at: nil,
__meta__: #Ecto.Schema.Metadata<:built, "">
},
valid?: true
>,
name: "form",
data: nil,
form_keys: [],
forms: %{},
domain: Tunez.Music,
method: "post",
submit_errors: [name: {"is required", []}],
id: "form",
transform_errors: nil,
original_data: nil,
transform_params: nil,
prepare_params: nil,
prepare_source: nil,
raw_params: %{name: "Best Band Ever"},
warn_on_unhandled_errors?: true,
any_removed?: false,
added?: false,
changed?: false,
touched_forms: MapSet.new([:name]),
valid?: false,
errors: true,
submitted_once?: true,
just_submitted?: true,
...
>}
defmodule Tunez.Music.Artist do
use Ash.Resource, otp_app: :tunez, domain: Tunez.Music, data_layer: Ash.DataLayer.Mnesia

mnesia do
table :artists
end

actions do
defaults [:create, :read, :update, :destroy]
end

attributes do
uuid_primary_key :id

attribute :name, :string do
allow_nil? false
end

attribute :biography, :string
create_timestamp :inserted_at
update_timestamp :updated_at
end
end
defmodule Tunez.Music.Artist do
use Ash.Resource, otp_app: :tunez, domain: Tunez.Music, data_layer: Ash.DataLayer.Mnesia

mnesia do
table :artists
end

actions do
defaults [:create, :read, :update, :destroy]
end

attributes do
uuid_primary_key :id

attribute :name, :string do
allow_nil? false
end

attribute :biography, :string
create_timestamp :inserted_at
update_timestamp :updated_at
end
end

Did you find this page helpful?