在我的帖子模型中,我实现了一个简单的验证
def changeset(model, params \\ :empty) do
model
|> cast(params, @required_fields, @optional_fields)
|> validate_length(:content, min: 2)
|> validate_length(:content, max: 500)
end
在提交视图创建后,我想在用户提交时出现错误时显示错误,这里是呈现错误的视图
<%= 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>
<ul>
<%= for {attr, message} <- f.errors do %>
<%IEx.pry%>
<li><%= humanize(attr) %> <%= message %></li>
<% end %>
</ul>
</div>
<% end %>
我收到此错误(Protocol.UndefinedError) protocol Phoenix.HTML.Safe not implemented for {"should be at least %{count} character(s)", [count: 2]}
(phoenix_html) lib/phoenix_html/safe.ex:74: Phoenix.HTML.Safe.Tuple.to_iodata/1
我无法找出为什么会发生这种情况,我在另一个凤凰应用程序(也在凤凰文档中)进行了类似的验证,这种应用程序完美无缺
更新 - 早期的应用使用较旧的Ecto和phoenix版本,我目前使用的是Ecto 2.0 +和Phoenix 1.1,
答案 0 :(得分:6)
在变更集中显示错误消息的正确方法是使用MyApp.ErrorHelpers.translate_error/1
。
替换:
<li><%= humanize(attr) %> <%= message %></li>
与
<li><%= humanize(attr) %> <%= translate_error(message) %></li>
演示:
iex(1)> MyApp.ErrorHelpers.translate_error {"should be at least %{count} character(s)", [count: 2]}
"should be at least 2 character(s)"