循环遍历消息的content_tag()生成嵌套列表

时间:2014-03-11 02:47:33

标签: html ruby-on-rails ruby html-lists erb

我正在尝试根据表单中的无效输入创建一个有条件地显示错误消息的视图。我在部分名为_error_messages.html.erb的视图中有错误消息部分。这是该文件的代码:

<% if @new_partner.errors.any? %>
    <p>The form contains <%= pluralize(@new_partner.errors.count, "error") %></p>
    <ul>
        <% @new_partner.errors.each do |message| %>
            <%= content_tag(:li, message) %>
        <% end %>
    </ul>
<% end %>

当表单上有错误时,partial会生成多个带有空列表项的无序列表。这是生成的HTML:

The form contains 3 errors
        <ul>
            <li></li>
        <li>
        <ul>
            <li></li>
        <li>
        <ul>
            <li></li>
        <li>

问题是我已经测试了不同错误的表单,计数总是正确的。代码生成的列表数量也与该数量一致。我没看到什么?

2 个答案:

答案 0 :(得分:1)

您需要循环浏览errors.messages@new_partner.errors会为您提供ActiveModel::Errors的实例。

然后errors.messages将保留ActiveSupport::OrderedHash个模型属性,其中错误为关键,错误消息为值。

使用map更新代码以循环@new_partner.errors.messages哈希。

<% @new_partner.errors.messages.map do |attr, message| %>
  <%= content_tag(:li, "#{attr} #{message}") %>
<% end %>

ActiveModel::Errors还为您提供了一个full_messages方法,该方法返回一组完整的错误消息。在这种情况下,如果您选择这样做,您可以将上述代码更新为:

<% @new_partner.errors.full_messages.each do |message| %>
  <%= content_tag(:li, message) %>
<% end %>

答案 1 :(得分:0)

因此,从这个问题中吸取的教训是跟踪您的文件。

_error_messages.html.erb部分最初是从app/views/shared/呈现的。我不小心创建了该文件的副本,并将其粘贴在app/views/layouts/其他部分文件的位置,并继续处理该文件。结果,我所更改的内容都没有在最终的网页上呈现。通过使用shared/中的部分覆盖layouts/中的部分,它使用了我在更多关注时编写的工作代码。

在这些愚蠢的情况下经常出现错误,所以在请求帮助之前,请务必仔细检查所有基本的事情,因为这样的事情比你想象的更频繁。