wintermeyer

wintermeyer

Setup:

mix igniter.install ash_authentication_phoenix
mix ash_authentication.add_strategy password

I create a user in the web application. Now I want to access that user in the iex. How can I do that? This doesn’t work:

iex(5)> ExampleApp.Accounts.User |> Ash.Query.filter(email = "bob@example.com") |> Ash.read!()
** (Ash.Error.Invalid) Invalid Error

* No primary action of type :read for resource ExampleApp.Accounts.User, and no action specified

The resource includes this code:

    read :get_by_email do
      description "Looks up a user by their email"
      get? true

      argument :email, :ci_string do
        allow_nil? false
      end

      filter expr(email == ^arg(:email))
    end

How can I use that in the iex to fetch a single user by his email address?

Showing Posts 1 to 9

zachdaniel

zachdaniel

Creator of Ash

Relevant docs on primary actions: Actions — ash v3.29.3

I considered making the generators add a primary read action, but users is a pretty sensitive resource and I wanted to add only the minimal required to power authentication.

You will also need to add authorize?: false to your call because of the policies on users. A mild inconvenience, but the security benefits are worth it :slight_smile:

So after adding a primary action: Ash.get!(User, <id>, authorize?: false)

wintermeyer

wintermeyer OP

So adding primary? true to an action should solve my problem. Let’s do that:

    read :get_by_email do
      primary? true
      description "Looks up a user by their email"
      get? true

      argument :email, :ci_string do
        allow_nil? false
      end

      filter expr(email == ^arg(:email))
    end

But it doesn’t work:

iex(1)> alias ExampleApp.Accounts.User
ExampleApp.Accounts.User
iex(2)> Ash.get_by_email(User, "bob@example.com", authorize?: false)
** (UndefinedFunctionError) function Ash.get_by_email/3 is undefined or private
    (ash 3.4.28) Ash.get_by_email(ExampleApp.Accounts.User, "sw@wintermeyer-consulting.de", [authorize?: false])
    iex:2: (file)

What is my mistake?

frankdugan3

frankdugan3

It’s not defined on the Ash module. You want something like Ash.get!(User, ...) like Zach showed in his example.

zachdaniel

zachdaniel

Creator of Ash

Primary actions should not define required arguments generally. You would leave the arguments out, and Ash.get does the filtering.

zachdaniel

zachdaniel

Creator of Ash

If you want a named function, use code interfaces.

wintermeyer

wintermeyer OP

You want something like Ash.get!(User, ...) like Zach showed in his example.

Until now nobody gave me an actual example that I or anybody else who runs into the same problem can use.

I really don’t care how. I just want to fetch the user with the email address bob@example.com. How can I do this and what is the most “Ash like” way?

zachdaniel

zachdaniel

Creator of Ash

There are examples of using Ash.get in the read actions guide:

The most idiomatic way to do this is as follows:

Add the default read

# lib/accounts/user.ex

actions do
  defaults [:read]
end

Add a code interface on the domain

# lib/accounts.ex
resource ExampleApp.Accounts.User do
  define :get_user_by_email, action: :read, get_by: [:email]
end

Call it

ExampleApp.Accounts.get_by_email!("me@example.com", authorize?: false)
wintermeyer

wintermeyer OP

Thank you Zach! That solves my problem. :folded_hands:

Follow up understanding issue: Why don’t/can’t I use the already existing read :get_by_email do ... end code in the user.ex file for this?

zachdaniel

zachdaniel

Creator of Ash

Oh, right :thinking: I forgot that we generated that action in the auth generators TBH :sweat_smile: I thought it was a custom action you had written.

You can use that existing action. In that case, the only thing you need is this:

resource ExampleApp.Accounts.User do
  define :get_by_email, args: [:email]
end

Generally speaking, making an action just to get something by a given field is not necessary, because code interfaces have get_by option, and you can use Ash.get as well. However, in the case of AshAuthentication it needs to be guaranteed to have an action whose name it knows in order to look up users for authentication. You’re free to use that generated action for this as well :+1:

— All posts loaded —

Where Next? Top

Trending in Questions Top

katta
I having some trouble figuring out if I have set myself too strict of standards for my production server. Currently I can handle 75% of r...
New
achenet
Hello, I’m trying to build a basic Phoenix web-app, and I’d like to use Tailwind. However, when I launch mix phx.server, I get an error...
New
Cxx-mlr
I’m working on a small exercise involving update_in/3, and I came up with this solution: data = %{ name: "Periodic Table", category:...
New
ChrisAmelia
I’ve got trouble wrapping my head around the order in which functions are called in this snippet (from Phoenix’s authentication): toke...
New
dillonoconnor
Is there any way to avoid the Hologram compiler running when using iex? It seems like the front-end code could potentially be disregarded...
New
thiagogsr
** (ArgumentError) expected :max_attempts to be a positive integer, got: {:@, [line: 10, column: 19], [{:max_attempts, [line: 10, column:...
New
unaware8150
Hello folks! So at work, we are seeing some situations where we have to define some “fixed” strings that are used across the codebase in...
New

Other Trending Topics Top

GenericJam
Edit: 2026 May 15 - This post is archived. Mob is alive!! Main docs: mob v0.7.11 — Documentation A bit of explanation for the slightly c...
New
mudasobwa
I am happy to introduce the very α version of the new programming language compiled to BEAM. Welcome Cure. It has literally three kille...
New
garrison
Hobbes is a low-level distributed database for the Elixir programming language. Hobbes provides a simple, safe, and scalable storage lay...
New
budgie
A little off-topic, but I feel like people here have a good head on their shoulders. I used to be quite good at making software. Was luc...
New
KristerV
Hey. Is there anyone here who creates agents in their apps? Not talking about using agents, but creating them. I’m finding it pretty diff...
New
mcass19
ExRatatui lets you cook up rich terminal UIs in Elixir, powered by Rust’s ratatui via Rustler NIFs. Build interactive terminal applicatio...
New

We're in Beta

About us Mission Statement

Options

Thread Display Mode




Thread Preview

Skip Thread Previews