Hi,
I have the following code in my resource
actions do
create :create do
change relate_actor(:created_by)
change relate_actor(:updated_by)
end
end
This works with ash_admin. When I add records based on the user ive selected as the actor is automatically assigned.
In my live view I have current_user
on the socket and would like to associate it with the record when adding, updating or validating the form etc.
defmodule WedEventsWeb.EventLive.FormComponent do
use WedEventsWeb, :live_component
alias WedEvents.Events
@impl true
def render(assigns) do
~H"""
<div>
<.header>
<%= @title %>
<:subtitle>Use this form to manage event records in your database.</:subtitle>
</.header>
<.simple_form
for={@form}
id="event-form"
phx-target={@myself}
phx-change="validate"
phx-submit="save"
>
<.input field={@form[:title]} label="Title" />
<.input field={@form[:description]} label="Description" />
<.input field={@form[:location]} label="Location" />
<.input field={@form[:start_time]} label="Start Time" type="datetime-local" />
<.input field={@form[:end_time]} label="End Time" type="datetime-local" />
<:actions>
<.button phx-disable-with="Saving...">Save event</.button>
</:actions>
</.simple_form>
<%= if @form.errors != [] do %>
<div class="alert alert-danger">
<p>Oops, something went wrong! Please check the errors below.</p>
<ul>
<%= for {field, error} <- @form.errors do %>
<li><strong><%= field %>:</strong> <%= translate_error(error) %></li>
<% end %>
</ul>
</div>
<% end %>
</div>
"""
end
@impl true
def update(%{event: event} = assigns, socket) do
{:ok,
socket
|> assign(assigns)
|> assign_new(:form, fn ->
to_form(AshPhoenix.Form.for_create(Events.Event, :create, api: Events))
end)}
end
@impl true
def handle_event("validate", %{"form" => event_params}, socket) do
# IO.inspect(socket.assigns.current_user, label: "current_user")
form = AshPhoenix.Form.validate(socket.assigns.form, event_params)
{:noreply, assign(socket, form: form)}
end
def handle_event("save", %{"form" => event_params}, socket) do
save_event(socket, socket.assigns.action, event_params)
end
defp save_event(socket, :edit, event_params) do
case Events.update_event(socket.assigns.event, event_params) do
{:ok, event} ->
notify_parent({:saved, event})
{:noreply,
socket
|> put_flash(:info, "Event updated successfully")
|> push_patch(to: socket.assigns.patch)}
{:error, %Ecto.Changeset{} = changeset} ->
{:noreply, assign(socket, form: to_form(changeset))}
end
end
defp save_event(socket, :new, event_params) do
case AshPhoenix.Form.submit(socket.assigns.form, params: event_params) do
{:ok, event} ->
notify_parent({:saved, event})
{:noreply,
socket
|> put_flash(:info, "Event created successfully")
|> push_patch(to: socket.assigns.patch)}
{:error, form} ->
{:noreply, assign(socket, form: form)}
end
end
defp notify_parent(msg), do: send(self(), {__MODULE__, msg})
end
defmodule WedEventsWeb.EventLive.Index do
use WedEventsWeb, :live_view
import Ash.Query
alias WedEvents.Events
alias WedEvents.Events.Event
@impl true
def mount(_params, _session, socket) do
{:ok, events} = Event |> Ash.read()
{:ok, stream(socket, :events, events)}
end
@impl true
def handle_params(params, _url, socket) do
{:noreply, apply_action(socket, socket.assigns.live_action, params)}
end
defp apply_action(socket, :edit, %{"id" => id}) do
socket
|> assign(:page_title, "Edit Event")
|> assign(:event, Events.get_by_id(id))
end
defp apply_action(socket, :new, _params) do
socket
|> assign(:page_title, "New Event")
|> assign(
:event,
AshPhoenix.Form.for_create(Events.Event, :create, api: Events)
)
end
defp apply_action(socket, :index, _params) do
socket
|> assign(:page_title, "Listing Events")
|> assign(:event, nil)
end
@impl true
def handle_info({WedEventsWeb.EventLive.FormComponent, {:saved, event}}, socket) do
{:noreply, stream_insert(socket, :events, event)}
end
@impl true
# def handle_event("delete", %{"id" => id}, socket) do
# event = Events.get_by_id(id)
# {:ok, _} = Events.delete_event(event)
# {:noreply, stream_delete(socket, :events, event)}
# end
end
Where do I “associate” the current_user for those fields on the form?
Seems like a silly question but I want to know how I can make it work for both ash_admin and live views too
Thanks