【问题标题】:Phoenix Phoenix.HTML.Safe not implementedPhoenix Phoenix.HTML.Safe 未实现
【发布时间】:2016-10-20 05:10:15
【问题描述】:

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

  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

我不知道为什么会这样,我在另一个 phoenix 应用程序(也在 phoenix 文档中)进行了类似的验证,效果很好

更新 - 早期的应用使用的是旧的 Ecto 和 phoenix 版本,我目前使用的是 Ecto 2.0 + 和 Phoenix 1.1,

【问题讨论】:

    标签: elixir phoenix-framework


    【解决方案1】:

    在变更集中显示错误消息的正确方法是使用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)"
    

    【讨论】:

    • 谢谢,我没有意识到我的应用正在使用 Ecto 2.0
    • 我相信它是在 Phoenix 1.1 中与 Gettext (phoenixframework.org/blog/upgrading-from-v10-to-v11) 一起添加的,与 Ecto 2.0 无关。
    • 我明白了,我确实从旧版本的 phoenix 复制了模板,谢谢
    • 您可能也升级了 Phoenix。我在 Phoenix 1.1 + Ecto 1.1.8 应用程序上运行了上述“演示”。
    猜你喜欢
    • 2017-04-19
    • 2023-02-15
    • 1970-01-01
    • 2017-07-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-11
    • 1970-01-01
    • 2016-03-11
    相关资源
    最近更新 更多