【发布时间】:2015-03-13 07:08:30
【问题描述】:
我正在尝试创建一个基本的 CRUD 应用程序,但我遇到了验证问题。这是我的控制器操作:
def update(conn, %{"id" => id, "user" => params}) do
case Repo.get(User, String.to_integer(id)) do
user when is_map(user) ->
user = Map.merge(user, atomize_keys(params))
case User.validate(user) do
[] ->
Repo.update(user)
redirect conn, to: user_path(:show, user.id)
errors ->
text conn, "Validation Failed!"
##render conn, "editform.html", user: user, errors: errors
end
_ ->
redirect conn, to: user_path(:index)
end
end
还有我的模特:
defmodule MyApp.User do
use Ecto.Model
validate user,
email: present()
schema "users" do
field :first_name, :string
field :last_name, :string
field :email, :string
field :created_at, :datetime, default: Ecto.DateTime.local
field :updated_at, :datetime, default: Ecto.DateTime.local
end
end
User.validate(user) 似乎返回了一些东西,但不是错误 - form.html 中没有显示错误。我在这里想念什么?这可能是 atomize_keys() 函数的问题吗?这是那个:
defp atomize_keys(struct) do
Enum.reduce struct, %{}, fn({k, v}, map)
-> Map.put(map, String.to_atom(k), v) end
end
【问题讨论】:
-
抱歉,我标记了它,但没有提到这是带有 Phoenix 框架的 Elixir。
-
快速提问?您正在运行什么版本的 ecto?较新的版本 (>0.7) 使用变更集而不是验证。可能是问题的一部分...
-
我现在在工作,这是我的家庭项目,但我确实检查了 Ecto 源代码,发现 present() 是一个函数。它也不会使编译失败,这让我认为存在“验证”宏。今晚我会检查版本 - 你能告诉我后续版本的文档方向吗?
-
好吧,事实证明,我有一个旧版本的 Ecto。我克隆了 Ecto 9.0 和 Phoenix 0.10,在搞砸了几个小时后,无法连接到数据库。我已经在 confix.exs 中设置了我的配置,但我收到了“无效密码”消息。在终端中使用 psql 时密码有效:-/ 对新版本 ecto 有什么建议吗?
标签: elixir phoenix-framework ecto