lifeofdan
I am having an issue where form field errors are not being displayed under the following scenario. Load the page, fill one field of the form, click “submit”. The errors are being shown on the struct but there is no error on the form fields. However, if you just reload the page and click submit without touching any of the inputs you get the “is required” errors. Validation on individual fields while filling out the form also works as expected. Here is my resource.
defmodule App.Public.Contact do
use Ash.Resource,
domain: App.Public,
authorizers: [Ash.Policy.Authorizer],
data_layer: AshPostgres.DataLayer,
extensions: [AshJsonApi.Resource]
require Ash.Expr
json_api do
type "contact"
end
postgres do
table "public_contacts"
repo App.Repo
end
actions do
defaults [:read, :destroy, update: :*]
create :send_message do
accept [:email, :message, :name]
validate match(
:email,
~r<^[a-zA-Z2-9.!#$%&'*+/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$>
) do
message "invalid email"
end
end
end
policies do
policy action(:send_message) do
authorize_if always()
end
policy action_type(:read) do
authorize_if expr(^actor(:kind) == :manager)
end
end
attributes do
uuid_primary_key :id
attribute :email, :ci_string, allow_nil?: false, public?: true
attribute :message, :string, allow_nil?: false, public?: true
attribute :name, :string, allow_nil?: false, public?: true
create_timestamp :created_at
update_timestamp :updated_at
end
end
Here is my form
defmodule App.ContactLive do
use AppWeb, :live_view
@impl true
def render(assigns) do
~H"""
<div class="grid grid-cols-1 md:grid-cols-2 gap-4 my-8">
<div class="text-gray-700">
<.simple_form id="contact-form" for={@form} phx-submit="submit" phx-change="validate">
<div class="grid sm:grid-cols-2 gap-10">
<div>
<.input
type="text"
class={@disabled_loading_state}
field={@form[:name]}
placeholder="John Doe"
label="Name"
/>
</div>
<div>
<.input
type="email"
class={@disabled_loading_state}
field={@form[:email]}
placeholder="john@example.com"
label="Email"
/>
</div>
</div>
<.input
class={@disabled_loading_state}
field={@form[:message]}
placeholder="Enter your message here..."
label="Message"
type="textarea"
/>
<:actions>
<.button phx-disable-with="Sending..." class="phx-submit-loading:cursor-not-allowed">
Submit
</.button>
</:actions>
</.simple_form>
</div>
<div class="mx-4 md:border-l border-gray-400 bg-gray-200 h-screen">
<div class="text-center mx-4 lg:mx-12 md:px-4 flex items-stretch">
<div class="md:h-72 relative">
<div class="relative md:top-1/2">
<h1 class="leading-none mb-16">We want to hear from you!</h1>
</div>
</div>
</div>
</div>
</div>
"""
end
@impl true
def mount(_params, _session, socket) do
form =
App.Public.Contact
|> AshPhoenix.Form.for_create(:send_message, as: "contact")
|> to_form()
disabled_loading_state =
"phx-submit-loading:cursor-not-allowed phx-submit-loading:bg-slate-50 phx-submit-loading:text-slate-500 phx-submit-loading:border-slate-200"
{:ok,
socket
|> assign(:disabled_loading_state, disabled_loading_state)
|> assign(:form, form)}
end
@impl true
def handle_event("validate", params, socket) do
validate = AshPhoenix.Form.validate(socket.assigns.form, params["contact"])
{:noreply, socket |> assign(form: validate)}
end
@impl true
def handle_event("submit", params, socket) do
case AshPhoenix.Form.submit(socket.assigns.form, params: params["contact"]) do
{:ok, form} ->
{:noreply,
socket
|> put_flash(:info, "Thank you for your message #{form.email}!")}
{:error, form} ->
{:noreply, socket |> assign(form: form)}
end
end
end
Is this expected behaviour or is this a bug? Also, is there a way I can manually take over this error behaviour when required? Any help appreciated, this is my first attempt using phoenix liveview so I accept I could be doing something wrong.
Thanks in advance.
Trending in Questions
I’m working on a project that simulates the bumbl example in the programming phoenix book. It acts almost like an email client. We have a...
New
Hello,
I know there is an approach for handling lists that allows for optimized traversal, but I can’t recall the specific method (somet...
New
Hi everyone,
I am toying with the idea of building a “match maker” for giving personal help to people that wants to start coding.
I sta...
New
Documentation
While reading the Scoped Routes section, I noticed that the documentation currently refers to a problem without explainin...
New
So my question is quite simple and i have found no conclusive answer on forum, google or AI.
Should we use :erlang.float for Integer to ...
New
I recently noticed that Elixir’s Logger defaults its primary log level to :debug when no :logger, :level application configuration is pre...
New
apply_graft/2 doesn’t rewrite an add_many sub-workflow’s deps on an add step. Grafted jobs cancel with “upstream job was deleted”
Version...
New
Other Trending Topics
Hey, I’m Jesse and I’m the main contributor behind Dexter, a full-featured, lightning-fast Elixir LSP optimized for large codebases. It s...
New
I am happy to introduce the very α version of the new programming language compiled to BEAM.
Welcome Cure.
It has literally three kille...
New
Hi there! We created Gust: A task orchestrator inspired by Airflow.
For those who have never heard about Aiflow, it’s a Python-based wor...
New
Hi everyone!
The first release candidate for the Expert language server project is now available!
We’ve published a press release detai...
New
Beam Bots (or just BB for short) is a framework for building fault-tolerant robotics applications in Elixir using familiar OTP patterns. ...
New
Xamal is a deployment tool for Elixir apps that deploys native releases to bare metal servers over SSH. It’s a port of GitHub - basecamp/...
New
Categories:
Sub Categories:
Forums
Popular Tags
- #ecto
- #liveview
- #troubleshooting
- #learning-elixir
- #library
- #deployment
- #erlang
- #testing
- #genserver
- #mix
- #absinthe
- #remote-other
- #otp
- #plug
- #how-to-question
- #macros
- #postgres
- #elixirconf
- #channels
- #exunit
- #discussion
- #code-sync
- #podcasts
- #javascript
- #onsite
- #dialyzer
- #docker
- #authentication
- #umbrella
- #full-time-contract
- #podcasts-by-brainlid
- #ecto-query
- #elixirconf-us
- #ai
- #blog-post
- #elixir-ls
- #phoenix_html
- #iex
- #graphql
- #genstage
- #websockets
- #supervisor
- #advent-of-code
- #distillery
- #processes
- #api
- #forms
- #metaprogramming
- #hex
- #security











Marked As Solved- Show Best Posts
- Show All (oldest first)
- Show All (newest first)
zachdaniel
Hmm…I think there was a recent change that only shows errors on touched fields, could that be part of the error that you’re seeing? There would be some code in your core components file like
If you remove that and just do
errors = field.errors, does it behave more as you’d expect?Also Liked
lifeofdan
I checked out
. Thanks to all those who continued to follow this up even after I had decided to just go my own way.
mainand it does now, indeed, work as expected. (once I un-delete theerrors = if Phoenix.Component.used_input?(field), do: field.errors, else: []). Now I can delete a ton of codeIt is also interesting that this bugfix was merged into
mainon Sept 9th but still hasn’t been put into a release yet. This seems like something that everyone would be running into at the moment if they have initialized a new project. Glad it is fixed though, and I guess I will run onmainbranch until this is merged into a release.lifeofdan
Thank you! This doesn’t exactly give me the behaviour that I want but it puts me exactly where I need to be to get what I want. Thank you so much, I knew it had to be something simple like this!
zachdaniel
There is some interesting behavior here, and using a repro from @carlgleisner I’ve ultimately decided to open a bug on LiveView. I could be wrong, it could be something wrong with
AshPhoenix.Form, but I have not been able to identify what that would be.Last Post!
7rans
So is there a way to “fake touch” a field?
I need to validate a field based when another field changes. It won’t show the error on the former field because it is not “touched”.