Phoenix 1.6 表单Changeset存在报错但error_tag不显示如何解决
问题原因
该问题90%以上的场景是模板内form_for绑定的changeset有误:你在edit.html模板中生成表单时,没有使用控制器传入的带错误信息的@changeset,而是直接通过仓库实体@repo新生成了一个空的changeset。
此时页面顶部告警读取的是控制器传入的@changeset(有action属性、携带错误信息),所以可以正常渲染;但表单绑定的是新生成的空changeset,没有错误信息,自然无法渲染对应字段的错误提示。
修复方案
第一步:检查
edit.html模板的form_for写法,确认绑定的是控制器传入的@changeset,不要自己生成新的changeset
常见错误写法:<!-- 错误:新生成的changeset不带任何错误信息,覆盖了控制器传入的参数 --> <%= form_for RepositoryManager.change_repository(@repo), @action, fn f -> %>正确写法:
<!-- 正确:直接使用控制器传入的带错误的changeset --> <%= form_for @changeset, @action, fn f -> %>第二步:如果确认绑定逻辑没有问题,可在表单中临时添加调试代码,确认错误是否传递到表单结构体:
<div class="mb-3"> <!-- 调试输出:确认changeset错误是否存在 --> <p>全局changeset错误:<%= inspect @changeset.errors %></p> <p>表单字段错误:<%= inspect f.errors %></p> <%= label f, :slug, class: "form-label" %> <%= text_input f, :slug, class: "form-control" %> <%= error_tag f, :slug %> </div>如果输出显示
@changeset.errors有值但f.errors为空,说明你还是绑定了错误的changeset,回到第一步排查即可。第三步:少数情况是视图层未导入错误帮助函数,确认项目
lib/xxx_web.ex的view定义中包含以下导入语句:def view do quote do # 其他已有导入保持不变 import Phoenix.HTML.ErrorHelpers end end
内容的提问来源于stack exchange,提问作者thodg
相关产品推荐
相关产品推荐

