Phoenix Phoenix.HTML.Safe没有实现

cod*_*hal 2 elixir phoenix-framework

在我的帖子模型中,我实现了一个简单的验证

  def changeset(model, params \\ :empty) do
    model
    |> cast(params, @required_fields, @optional_fields)
    |> validate_length(:content, min: 2)
    |> validate_length(:content, max: 500)
  end
Run Code Online (Sandbox Code Playgroud)

在提交Post创建表单视图时,我想显示错误,如果用户提交有问题,这里是呈现错误的视图

<%= 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 %>
Run Code Online (Sandbox Code Playgroud)

我收到了这个错误 (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,

Dog*_*ert 6

在Changeset中显示错误消息的正确方法是使用MyApp.ErrorHelpers.translate_error/1.

更换:

<li><%= humanize(attr) %> <%= message %></li>
Run Code Online (Sandbox Code Playgroud)

<li><%= humanize(attr) %> <%= translate_error(message) %></li>
Run Code Online (Sandbox Code Playgroud)

演示:

iex(1)> MyApp.ErrorHelpers.translate_error {"should be at least %{count} character(s)", [count: 2]}
"should be at least 2 character(s)"
Run Code Online (Sandbox Code Playgroud)