mirror of
https://github.com/ash-project/ash.git
synced 2024-09-20 05:23:03 +12:00
fix: handle error case in create
improvement: add `ref` template helper fix: don't require attributes if an argument overrides them
This commit is contained in:
parent
7ba9715f27
commit
23ea0ee056
4 changed files with 24 additions and 13 deletions
|
@ -49,9 +49,13 @@ defmodule Ash.Actions.Create do
|
|||
{:ok, %{data: %{commit: %^resource{} = created}} = engine_result} ->
|
||||
add_notifications(created, engine_result, return_notifications?)
|
||||
|
||||
{:error, %Ash.Engine.Runner{errors: errors, changeset: runner_changeset}} ->
|
||||
{:error, %Ash.Engine.Runner{errors: errors, changeset: %Ash.Changeset{} = runner_changeset}} ->
|
||||
errors = Helpers.process_errors(changeset, errors)
|
||||
{:error, Ash.Error.to_error_class(errors, changeset: runner_changeset || changeset)}
|
||||
{:error, Ash.Error.to_error_class(errors, changeset: runner_changeset)}
|
||||
|
||||
{:error, %Ash.Engine.Runner{errors: errors}} ->
|
||||
errors = Helpers.process_errors(changeset, errors)
|
||||
{:error, Ash.Error.to_error_class(errors, changeset: changeset)}
|
||||
|
||||
{:error, error} ->
|
||||
error = Helpers.process_errors(changeset, error)
|
||||
|
|
|
@ -996,10 +996,13 @@ defmodule Ash.Changeset do
|
|||
[]
|
||||
end
|
||||
|
||||
masked_argument_names = Enum.map(action.arguments, & &1.name)
|
||||
|
||||
resource
|
||||
|> Ash.Resource.Info.attributes()
|
||||
|> Enum.reject(
|
||||
&(&1.allow_nil? || &1.private? || !&1.writable? || &1.generated? || &1.name in belongs_to ||
|
||||
&(&1.allow_nil? || &1.private? || !&1.writable? || &1.generated? ||
|
||||
&1.name in masked_argument_names || &1.name in belongs_to ||
|
||||
&1.name in allow_nil_input)
|
||||
)
|
||||
end
|
||||
|
|
|
@ -7,6 +7,12 @@ defmodule Ash.Filter.TemplateHelpers do
|
|||
@doc "A helper for using action arguments in filter templates"
|
||||
def arg(name), do: {:_arg, name}
|
||||
|
||||
@doc "A helper for creating a reference"
|
||||
def ref(name), do: {:_ref, [], name}
|
||||
|
||||
@doc "A helper for creating a reference to a related path"
|
||||
def ref(path, name), do: {:_ref, path, name}
|
||||
|
||||
@doc """
|
||||
A helper for using query context in filter templates
|
||||
|
||||
|
|
|
@ -407,12 +407,6 @@ defmodule Ash.Query do
|
|||
end
|
||||
end
|
||||
|
||||
defmacro expr({var, _, context} = binding) when is_atom(var) and is_atom(context) do
|
||||
quote do
|
||||
unquote(binding)
|
||||
end
|
||||
end
|
||||
|
||||
defmacro expr(body) do
|
||||
if Keyword.keyword?(body) do
|
||||
quote do
|
||||
|
@ -431,6 +425,14 @@ defmodule Ash.Query do
|
|||
|
||||
defp do_expr(expr, escape? \\ true)
|
||||
|
||||
defp do_expr({op, _, nil}, escape?) when is_atom(op) do
|
||||
soft_escape(%Ash.Query.Ref{relationship_path: [], attribute: op}, escape?)
|
||||
end
|
||||
|
||||
defp do_expr({op, _, Elixir}, escape?) when is_atom(op) do
|
||||
soft_escape(%Ash.Query.Ref{relationship_path: [], attribute: op}, escape?)
|
||||
end
|
||||
|
||||
defp do_expr({:^, _, [value]}, _escape?) do
|
||||
value
|
||||
end
|
||||
|
@ -545,10 +547,6 @@ defmodule Ash.Query do
|
|||
end
|
||||
end
|
||||
|
||||
defp do_expr({op, _, nil}, escape?) when is_atom(op) do
|
||||
soft_escape(%Ash.Query.Ref{relationship_path: [], attribute: op}, escape?)
|
||||
end
|
||||
|
||||
defp do_expr({op, _, args}, escape?) when op in [:and, :or] do
|
||||
args = Enum.map(args, &do_expr(&1, false))
|
||||
|
||||
|
|
Loading…
Reference in a new issue