为什么生成的表单的验证检查变更集的":action"字段而不是":valid"?



例如,发出

mix phx.gen.html Accounts User users name:string age:integer

文档中的命令将生成form.html.eex

<%%= form_for @changeset, @action, fn f -> %>
<%%= if @changeset.action do %>
<div class="alert alert-danger">
<p>Oops, something went wrong! Please check the errors below.</p>
</div>
<%% end %>
<%= for {label, input, error} <- inputs, input do %>
<%= label %>
<%= input %>
<%= error %>
<% end %>
<div>
<%%= submit "Save" %>
</div>
<%% end %>

有没有理由不检查@changeset.valid? == false

目前的形式确实更短,并且只有在没有错误的情况下才nil:action密钥,这很有教育意义。

是否有任何其他需要考虑的因素(例如,稍后添加更多字段(,或者这只是个人喜好的问题?

不知何故错过了Phoenix.HTML.Form文档,在">关于:errors的说明"部分中说

如果未对变更集应用任何操作或操作设置为:ignore,即使变更集,表单对象上也不会显示任何错误 具有非空:errors值。

这对于表单字段上的验证提示之类的事情很有用,例如 新窗体的空变更集。该变更集无效,但我们 不想在实际用户操作之前显示错误 执行。

默认情况下,空变更集确实无效:

iex> %Ecto.Changeset{}
#Ecto.Changeset<action: nil, changes: %{}, errors: [], data: nil, valid?: false>

最新更新