Elixir 函数未定义或私有,但应可访问
我正在尝试从我的帐户域访问一个方法。我可以使用Elixir 函数未定义或私有,但应可访问,elixir,phoenix-framework,Elixir,Phoenix Framework,我正在尝试从我的帐户域访问一个方法。我可以使用iex中账户域中的任何方法,除了标记为\u admin/1(最后一个) 这是域名 defmodule Storex.Accounts do import Ecto.Query, warn: false alias Storex.Repo alias Storex.Accounts.User def create_user(attrs \\ %{}) do %User{} |> User.changeset(at
iex
中账户
域中的任何方法,除了标记为\u admin/1
(最后一个)
这是域名
defmodule Storex.Accounts do
import Ecto.Query, warn: false
alias Storex.Repo
alias Storex.Accounts.User
def create_user(attrs \\ %{}) do
%User{}
|> User.changeset(attrs)
|> Repo.insert()
end
def get_user!(id) do
Repo.get!(User, id)
end
def new_user() do
User.changeset(%User{}, %{})
end
def authenticate_user(email, password) do
Repo.get_by(User, email: email)
|> User.check_password(password)
end
def mark_as_admin(user) do
user
|> User.admin_changeset(%{is_admin: true})
|> Repo.update()
end
end
以下是我在iex中键入的内容:
iex(1)> alias Storex.Accounts
iex(2)> user = Accounts.get_user!(7)
[debug] QUERY OK source="accounts_users" db=2.2ms
SELECT a0."id", a0."email", a0."full_name", a0."password_hash",
a0."is_admin", a0."inserted_at", a0."updated_at" FROM "accounts_users"
AS a0 WHERE (a0."id" = $1) [7]
%Storex.Accounts.User{__meta__: #Ecto.Schema.Metadata<:loaded,
"accounts_users">,
email: "test@user.tld", full_name: "Test User", id: 7,
inserted_at: ~N[2018-01-14 11:52:14.472928], is_admin: false, password: nil,
password_hash:
"$2b$12$I7Kq8SgkWN77W3jx2QwaNe.so6z75xtYOIzl5Ws5kqlaTniLXMyIe",
updated_at: ~N[2018-01-14 11:52:14.472935]}
iex(3)> Accounts.mark_as_admin(user)
** (UndefinedFunctionError) function Storex.Accounts.mark_as_admin/1 is
undefined or private
(storex) Storex.Accounts.mark_as_admin(%Storex.Accounts.User{__meta__:
#Ecto.Schema.Metadata<:loaded, "accounts_users">, email:
"test@user.t~ld", full_name: "Test User", id: 7, inserted_at:
~N[2018-01-14 11:52:14.472928], is_admin: false, password: nil,
password_hash:
"$2b$12$I7Kq8SgkWN77W3jx2QwaNe.so6z75xtYOIzl5Ws5kqlaTniLXMyIe",
updated_at: ~N[2018-01-14 11:52:14.472935]})
您应该从项目的根目录启动IEx,如下所示
iex-S混音
如果编辑并保存代码,则应以相同的方式重新启动IEx、调用或更改要使用的代码,如:
iex>recompile()#重新编译并重新加载除mix.exs和configs之外的所有内容
iex>r Storex.Accounts#重新编译并重新加载单个模块
您确定在进行更改后重新启动了iex
吗?我确实没有重新启动iex
。但重启后,情况更糟。Accounts
域中的所有方法现在都是未定义或私有的
那么mix clean
和mix build
怎么样?您能让我们了解一下您的工作流程吗?你是怎么开始IEx的?文件Storex.Accounts在哪里?您是否从项目的根目录使用IEx-S mix
启动IEx?
iex(1)> alias Storex.Accounts
Storex.Accounts
iex(2)> Accounts.get_user!(7)
** (UndefinedFunctionError) function Storex.Accounts.get_user!/1 is
undefined or private