Thinking out loud so that you can give me feedback if I got this correct.
I can use Scope both to make sure that the calls I’m making are properly scope and I can use it to have a few handy things at hand on each different LiveView.
So, if I take the example from the docs.
defmodule MyApp.Scope do
defstruct [:current_user, :current_tenant, :locale]
defimpl Ash.Scope.ToOpts do
def get_actor(%{current_user: current_user}), do: {:ok, current_user}
def get_tenant(%{current_tenant: current_tenant}), do: {:ok, current_tenant}
def get_context(%{locale: locale}), do: {:ok, %{shared: %{locale: locale}}}
# You typically configure tracers in config files
# so this will typically return :error
def get_tracer(_), do: :error
# This should likely always return :error
# unless you want a way to bypass authorization configured in your scope
def get_authorize?(_), do: :error
end
end
current_user and current_tenant should be the :id , correct? Everything else I want to “carry with me” I should put in the :context.
I’m asking this because I initially started putting together a project and I thought it would be best to put the whole %User{} and the %Tenant{} so that I can access it all easily, but I’m not sure that’s what the rest of the community is doing.
So, if I want to have the tenant_slug with me at all times, I should modify the above example like:
defmodule MyApp.Scope do
defstruct [:current_user, :current_tenant, :locale, :slug]
defimpl Ash.Scope.ToOpts do
def get_actor(%{current_user: current_user}), do: {:ok, current_user}
def get_tenant(%{current_tenant: current_tenant}), do: {:ok, current_tenant}
def get_context(%{locale: locale, slug: slug}) do
{:ok, %{shared: %{locale: locale, slug: slug}}}
end
def get_tracer(_), do: :error
def get_authorize?(_), do: :error
end
end






















