Ecto验证与查询无错误提示:表单插入数据重定向正常但无报错
排查表单插入无错误提示的问题
看起来你遇到的问题是表单提交后重定向正常,但哪怕数据不符合验证规则,页面也没有任何错误反馈对吧?结合你给出的new动作代码,我从几个常见的踩坑点帮你排查:
1. 先检查create动作的错误处理逻辑
你只贴了new方法,核心问题大概率出在create动作里。新手常犯的错误是:当插入失败时直接做了重定向,导致带错误的changeset直接丢失——因为重定向会发起全新的请求,之前的changeset不会被自动携带过去。
正确的create逻辑应该是这样的:
def create(conn, %{"user" => user_params}) do case Accounts.create_user(user_params) do {:ok, user} -> conn |> put_flash(:info, "User created successfully.") |> redirect(to: Routes.user_path(conn, :show, user)) {:error, %Ecto.Changeset{} = changeset} -> # 失败时不要重定向!重新查询性别数据,渲染new模板并传入带错误的changeset genders = HexProject.Repo.all(from g in Gender, select: %{name: g.name, id: g.id}) render(conn, "new.html", changeset: changeset, genders: genders) end end
2. 确认模板是否正确渲染错误信息
就算你把带错误的changeset传回去了,也要确保表单模板里有对应的错误展示代码。比如在new.html.heex(或new.html.eex)里要加这些:
<!-- 全局错误提示 --> <%= if @changeset.action do %> <div class="alert alert-danger"> <p>哎呀,出问题了!请检查下面的错误提示。</p> </div> <% end %> <%= form_for @changeset, Routes.user_path(@conn, :create), fn f -> %> <!-- 单个字段的错误提示 --> <div class="form-group"> <%= label f, :name %> <%= text_input f, :name, class: "form-control" %> <%= error_tag f, :name %> <!-- 这个是关键,用来渲染字段的具体错误 --> </div> <!-- 其他表单字段... --> <%= submit "Create User", class: "btn btn-primary" %> <% end %>
如果模板里没加error_tag或者判断@changeset.action的逻辑,就算changeset有错误,页面也不会显示。
3. 验证Accounts.create_user是否正确返回错误changeset
检查你的Accounts上下文里的create_user函数,确保它在插入失败时正确返回{:error, changeset},而不是吞掉了错误:
def create_user(attrs \\ %{}) do %User{} |> User.changeset(attrs) |> HexProject.Repo.insert() end
如果这个函数里做了额外处理导致没返回带错误的changeset,控制器也拿不到错误信息。
4. 可选:确认flash消息的渲染(如果成功提示也没显示)
如果连成功的flash提示都没出现,要检查布局模板里是否加了flash消息的渲染代码:
<%= if get_flash(@conn, :info) do %> <div class="alert alert-info"><%= get_flash(@conn, :info) %></div> <% end %> <%= if get_flash(@conn, :error) do %> <div class="alert alert-danger"><%= get_flash(@conn, :error) %></div> <% end %>
先按这几个步骤排查,尤其是第1点——重定向丢失changeset是最常见的原因。如果还有问题,可以把create动作的完整代码贴出来,我再帮你细化分析。
内容的提问来源于stack exchange,提问作者Gotrek
相关产品推荐
相关产品推荐

