(代码引用已被匿名)药剂+凤凰:__module__报价
内未定义在我的凤凰模型,我有一些方法,这是多余的,像这样基本的一个:
def build(params) do
changeset(%__MODULE__{}, params)
end
由于我把它们放在我的模型模块中,它们工作正常,但我想避免代码重复,并且希望通过这样的帮助模块将它们提供给我的所有模型:
defmodule MyApp.Helpers.Model do
defmodule Changeset do
defmacro __using__(_opts) do
quote do
def build(params) do
changeset(%__MODULE__{}, params)
end
end
end
end
end
这样做,我得到一个错误:
== Compilation error on file lib/my_app/model/my_model.ex ==
** (CompileError) lib/my_app/model/my_model.ex:3: MyApp.Model.MyModel.__struct__/1 is undefined, cannot expand struct MyApp.Model.MyModel
(stdlib) lists.erl:1354: :lists.mapfoldl/3
的相关模型基本上是这样的:
defmodule MyApp.Model.MyModel do
use MyApp.Helpers, :model
use MyApp.Helpers.Model.Changeset # here for comprehension, should be in MyApp.Helpers quoted :model method
schema "my_table" do
field :name, :string
timestamps()
end
@required_fields ~w(name)a
@optional_fields ~w()
@derive {Poison.Encoder, only: [:name]}
def changeset(model, params \\ %{}) do
model
|> cast(params, @required_fields)
|> cast(params, @optional_fields)
|> validate_required(@required_fields)
|> validate_format(:name, ~r/^[a-z]{3,}$/)
|> unique_constraint(:name)
end
end
我想那是因为模块尚未在编译时间内定义宏,但我不知道,也没有如何解决这个问题,并使其工作。
这里的一些灯将不胜感激,谢谢。
你能也张贴你'在use'ing此模块的模块的代码? – Dogbert
你或许应该换'使用MyApp.Helpers。在MyModel模块中模型和定义MyModel行是后者(结构声明)先行。 – mudasobwa
好了,在@mudasobwa建议之后,我在'模式'调用之后放置了'使用MyApp.Helpers.Model.Changeset',它在'MyModel'中生成结构并且它可以工作。所以我想我们无法在凤凰通常的MyApp.Helpers,model中全局地使用这个'use',因为我们首先需要模式定义? – Sylver