【问题标题】:function is undefined or private while should be accessible函数未定义或私有,而应该可以访问
【发布时间】:2018-01-15 04:50:23
【问题描述】:

我正在尝试从我的 Accounts 域访问一个方法。除了mark_as_admin/1(最后一个)之外,我可以使用iexAccounts 域中的任何方法。

这是域名

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(1)> alias Storex.Accounts  
Storex.Accounts  
iex(2)> Accounts.get_user!(7)  
** (UndefinedFunctionError) function Storex.Accounts.get_user!/1 is   
undefined or private  

【问题讨论】:

  • 你确定你在做出改变后重启了iex
  • 我确实没有重启iex。但是重启之后,情况就更糟了。 Accounts 域中的所有方法现在都是 undefined or private
  • mix clean 然后mix build 怎么样?
  • 您能告诉我们更多关于您的工作流程的信息吗?你是如何开始 IEx 的? Storex.Accounts 文件在哪里?
  • 你是从项目的根目录使用iex -S mix 启动IEx 吗?

标签: elixir phoenix-framework


【解决方案1】:

您应该从项目的根目录启动 IEx,例如

iex -S mix.

如果您编辑您的代码并保存它,您应该以同样的方式重新启动 IEx,调用 recompile()reload any single modules 您已更改要使用的代码,例如:

iex> recompile() # recompiles and reloads everything except mix.exs and configs

iex> r Storex.Accounts # recompiles and reloads a single module

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-04-12
    • 2017-05-16
    • 2023-03-04
    • 1970-01-01
    • 1970-01-01
    • 2011-05-03
    • 2013-08-03
    • 1970-01-01
    相关资源
    最近更新 更多