Phoenix Phoenix.HTML.Safe не реализован

В моей модели поста я реализовал простую проверку

  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,


person coderVishal    schedule 18.06.2016    source источник


Ответы (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)"
person Dogbert    schedule 18.06.2016
comment
Спасибо, я не знал, что мое приложение использует Ecto 2.0. - person coderVishal; 18.06.2016
comment
Я полагаю, что он был добавлен в Phoenix 1.1 вместе с Gettext (phoenixframework.org/ blog/upgrade-from-v10-to-v11) и не имеет отношения к Ecto 2.0. - person Dogbert; 18.06.2016
comment
Понятно, я скопировал шаблон из старой версии феникса, спасибо - person coderVishal; 18.06.2016
comment
Вы, вероятно, тоже обновили Phoenix. Я запустил приведенную выше демонстрацию в приложении Phoenix 1.1 + Ecto 1.1.8. - person Dogbert; 18.06.2016