【问题标题】:form_for error messages in Ruby on RailsRuby on Rails 中的 form_for 错误消息
【发布时间】:2013-07-15 19:18:26
【问题描述】:

在 Rails 4 中使用 form_for 显示验证错误消息的首选方式是什么?

<%= form_for @post do |f| %>
  ...
<% end %>

【问题讨论】:

标签: ruby-on-rails ruby ruby-on-rails-4


【解决方案1】:

这就是我为名为@9​​87654321@ 的表单对象显示它们的方式

<% if @location.errors.any? %>
<ul>
  <% @location.errors.full_messages.each do |msg| %>
    <li><%= msg %></li>
  <% end %>
</ul>
<% end %>

注意:将上面的代码放在&lt;%= form_for @location do |f| %&gt;这一行之后

【讨论】:

    【解决方案2】:

    我更喜欢这样做并保持代码简单和干燥的方式如下:

    application_helper.rb

    中创建一个新的助手
    # Displays object errors
    def form_errors_for(object=nil)
      render('shared/form_errors', object: object) unless object.blank?
    end
    

    shared/_form_errors.html.erb

    中创建一个新的共享部分
    <% content_for :form_errors do %>
      <p>
        <%= pluralize(object.errors.count, "error") %> prevented the form from being saved:
      </p>
    
      <ul>
        <% object.errors.full_messages.each do |message| %>
          <li><%= message %></li>
        <% end %>
      </ul>
    <% end %>
    

    编辑您的 application.html.erb 文件以在您想要的位置包含错误:

    <%= yield :form_errors %>
    

    最后,将助手放在每个表单的开头:

    <%= form_for(@model) do |f| %>
      <%= form_errors_for @model %>
    
      <%# ... form fields ... %>
    <% end %>
    

    这使得管理和跨多个表单显示表单错误非常简单。

    【讨论】:

    • 非常感谢!在 Rails 4.x 中,创建一个名为“shared”的文件夹非常重要,这样才能正确调用部分,否则你会得到一个 ActionView::MissingTemplate 错误。
    • 在上面的例子中, 是替换标准的 还是补充?与标准产量相比,添加 :form_errors 有什么作用?
    • 不,它不会取代它。标准产量具有完全不同的用途,因为它在布局中呈现视图。
    • 等价于 ,这可能更容易理解(它只是打印出你之前存储在该键中的 html)跨度>
    • 干得好。节省了我的时间。 +1
    【解决方案3】:

    与 Rails 3 相同 -- 请参阅 f.error_messages in Rails 3.0http://railscasts.com/episodes/211-validations-in-rails-3 了解许多不同的可能性。

    我个人的偏好是使用 simple_form 并将错误放在输入旁边。

    【讨论】:

      【解决方案4】:

      我知道这不是所要求的,但如果您使用的是我推荐的 simple_form gem,您可以使用 f.error_notification,它采用 :message 作为选项。

      = f.error_notification message: form_errors_for(your_object)
      

      我使用的方法与 Wes 的答案非常相似; application_helper.rb

      内的 form_errors_for
      def form_errors_for_base(object)
        if object.errors.messages[:base].present?
          object.errors.messages[:base].join(",\n") + "."
        else
          nil
        end
      end
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-04-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-11-08
        相关资源
        最近更新 更多