Ecto 变更集和 Dialyzer 错误
Ecto changesets and Dialyzer errors
我有一个雨伞应用程序。我看到了 Dialyzer 的价值,并且正在尝试开始使用它。我已经走了很远,但我有一个关于 Ecto 的问题我无法解决。
这是用于处理身份验证的保护伞中的小应用程序。我可以 trim 把最简单的例子都写下来。
使用 Elixir 1.4.2 和 Dialyxir 0.4.0。
问题中的代码
defmodule Auth.Account do
use Ecto.Schema
import Ecto.Changeset
schema "auth_accounts" do
field :email, :string
field :password_hash, :string
field :password, :string, virtual: true
timestamps()
end
def build(params \ %{}) do
changeset(%__MODULE__{}, params)
end
def changeset(account, params \ %{}) do
account
|> cast(params, ~w(email password))
end
end
相关错误输出
lib/auth/account.ex:13: Function build/0 has no local return
lib/auth/account.ex:13: Function build/1 has no local return
lib/auth/account.ex:14: The call 'Elixir.Auth.Account':changeset(#{'__meta__':=#{'__struct__':='Elixir.Ecto.Schema.Metadata', 'context':='nil', 'source':={'nil',<<_:104>>}, 'state':='built'}, '__struct__':='Elixir.Auth.Account', 'email':='nil', 'id':='nil', 'inserted_at':='nil', 'password':='nil', 'password_hash':='nil', 'updated_at':='nil'},params@1::any())
will never return since it differs in the 1st argument from the success typing arguments: ({map(),map()} | #{'__struct__':=atom(), 'action'=>'delete' | 'insert' | 'nil' | 'replace' | 'update', 'changes'=>#{atom()=>_}, 'constraints'=>[#{'constraint':=binary(), 'field':=atom(), 'match':='exact' | 'suffix', 'message':={_,_}, 'type':='unique'}], 'data'=>'nil' | #{'__struct__':=atom()}, 'empty_values'=>_, 'errors'=>[{atom(),{_,_}}], 'filters'=>#{atom()=>_}, 'params'=>'nil' | #{binary()=>_}, 'prepare'=>[fun((map()) -> map())], 'repo'=>atom(), 'required'=>[atom()], 'types'=>'nil' | #{atom()=>atom() | {'array',_} | {'embed',map()} | {'in',_} | {'map',_}}, 'valid?'=>boolean(), 'validations'=>[{atom(),_}]},'invalid' | #{'__struct__'=>none(), atom() | binary()=>_})
看来问题出在 build
函数对 %__MODULE__{}
的使用上。请参阅此相关 。
但是,我想不出有效的替代语法。
Dogbert 由于无法重现而促使我深入挖掘。
我在 ecto ~> 2.0。 mix.lock 文件让我在 2.0.5。在 mix deps.unlock --all
和 mix deps.clean --all
和 mix deps.get
之后,我被提升到 ecto 2.1.3。
库升级后,dialyzer不再报错了。所以我的解决办法是升级到更新的 ecto 版本。
我有一个雨伞应用程序。我看到了 Dialyzer 的价值,并且正在尝试开始使用它。我已经走了很远,但我有一个关于 Ecto 的问题我无法解决。
这是用于处理身份验证的保护伞中的小应用程序。我可以 trim 把最简单的例子都写下来。
使用 Elixir 1.4.2 和 Dialyxir 0.4.0。
问题中的代码
defmodule Auth.Account do
use Ecto.Schema
import Ecto.Changeset
schema "auth_accounts" do
field :email, :string
field :password_hash, :string
field :password, :string, virtual: true
timestamps()
end
def build(params \ %{}) do
changeset(%__MODULE__{}, params)
end
def changeset(account, params \ %{}) do
account
|> cast(params, ~w(email password))
end
end
相关错误输出
lib/auth/account.ex:13: Function build/0 has no local return
lib/auth/account.ex:13: Function build/1 has no local return
lib/auth/account.ex:14: The call 'Elixir.Auth.Account':changeset(#{'__meta__':=#{'__struct__':='Elixir.Ecto.Schema.Metadata', 'context':='nil', 'source':={'nil',<<_:104>>}, 'state':='built'}, '__struct__':='Elixir.Auth.Account', 'email':='nil', 'id':='nil', 'inserted_at':='nil', 'password':='nil', 'password_hash':='nil', 'updated_at':='nil'},params@1::any())
will never return since it differs in the 1st argument from the success typing arguments: ({map(),map()} | #{'__struct__':=atom(), 'action'=>'delete' | 'insert' | 'nil' | 'replace' | 'update', 'changes'=>#{atom()=>_}, 'constraints'=>[#{'constraint':=binary(), 'field':=atom(), 'match':='exact' | 'suffix', 'message':={_,_}, 'type':='unique'}], 'data'=>'nil' | #{'__struct__':=atom()}, 'empty_values'=>_, 'errors'=>[{atom(),{_,_}}], 'filters'=>#{atom()=>_}, 'params'=>'nil' | #{binary()=>_}, 'prepare'=>[fun((map()) -> map())], 'repo'=>atom(), 'required'=>[atom()], 'types'=>'nil' | #{atom()=>atom() | {'array',_} | {'embed',map()} | {'in',_} | {'map',_}}, 'valid?'=>boolean(), 'validations'=>[{atom(),_}]},'invalid' | #{'__struct__'=>none(), atom() | binary()=>_})
看来问题出在 build
函数对 %__MODULE__{}
的使用上。请参阅此相关
但是,我想不出有效的替代语法。
Dogbert 由于无法重现而促使我深入挖掘。
我在 ecto ~> 2.0。 mix.lock 文件让我在 2.0.5。在 mix deps.unlock --all
和 mix deps.clean --all
和 mix deps.get
之后,我被提升到 ecto 2.1.3。
库升级后,dialyzer不再报错了。所以我的解决办法是升级到更新的 ecto 版本。