amos-kibet
Ash Policies: `nil` is not a Spark DSL module
I have a FilterCheck policy that looks like this:
use Ash.Policy.FilterCheck
def filter(actor, context, options) do
tenant_id = context.subject.tenant.id
resource_name =
options[:resource]
|> to_string()
|> String.split(".")
|> List.last()
expr(
exists(
MyApp.AccessRight,
tenant_id == ^tenant_id and
resource_name == ^resource_name and read == true)
)
)
# dbg()
end
and I use this policy in my resource this way:
policies do
policy action(:list_paginated) do
authorize_if MyFilterCheckPolicy
end
end
and here is how I use the resource action in my LiveView:
Posts.list_paginated(actor: current_user, tenant: tenant)
The problem:
For some reason, this setup does not work; it raises this error:
[error] ** (ArgumentError) `nil` is not a Spark DSL module.
nil.persisted(:data_layer)
(spark 2.2.31) lib/spark/dsl/extension.ex:138: Spark.Dsl.Extension.persisted!/3
(ash 3.4.21) lib/ash/filter/filter.ex:3734: Ash.Filter.do_hydrate_refs/2
... more stacktraces below
and interestingly, it works if I uncomment the dbg() call at the end of the policy (see code above).
How can I fix the above error?
Most Liked
zachdaniel
exists does not take a resource it takes a relationship or relationship oath.
i.e exists(access_rights, ....
or
exists(access_rights.user, ...
Please open an issue describing that bad error output and I will look to make it clearer.
zachdaniel
Ah, sorry I just looked more closely. You can’t use exists with anything other than a relationship reference. ^value is not a relationship reference.
Here is the related issue for the improvement we’d like to make. Support resources as aggregate targets in expressions · Issue #939 · ash-project/ash · GitHub
So to do this logic that you want you’ll need to do the work entirely in the check module. and return {:ok, true | false}
almirsarajcic
Since I needed to do a filter check instead of a simple check, I ended up with a manual relationship and with more knowledge about the powers of Ash. Mind getting blown every day… ![]()
Thanks!
Popular in Questions
Other popular topics
Categories:
Sub Categories:
Forums
Popular Tags
- #ecto
- #liveview
- #troubleshooting
- #learning-elixir
- #deployment
- #library
- #erlang
- #testing
- #genserver
- #mix
- #absinthe
- #remote-other
- #otp
- #plug
- #how-to-question
- #macros
- #postgres
- #channels
- #elixirconf
- #exunit
- #discussion
- #code-sync
- #javascript
- #podcasts
- #onsite
- #dialyzer
- #docker
- #authentication
- #umbrella
- #full-time-contract
- #podcasts-by-brainlid
- #ecto-query
- #elixir-ls
- #phoenix_html
- #iex
- #blog-post
- #graphql
- #genstage
- #ai
- #websockets
- #supervisor
- #advent-of-code
- #elixirconf-us
- #distillery
- #processes
- #forms
- #api
- #metaprogramming
- #security
- #performance










