Rails 3.0中的f.error_messages

Cra*_*ham 42 ruby ruby-on-rails ruby-on-rails-3

Rails 3.0已弃用f.error_messages,现在需要插件才能正常工作 - 但我想学习如何以(新)本机方式显示错误消息.我正在按照入门指南进行操作,该指南在实现注释表单时使用了已弃用的方法.例如:

<h2>Add a comment:</h2>
<%= form_for([@post, @post.comments.build]) do |f| %>
  <%= f.error_messages %>
<div class="field">
  <% f.label :commenter  %><br />
  <%= f.text_field :commenter  %>
</div>
<div class="field">
  <%= f.label :body %><br />
  <%= f.text_area :body %>
</div>
<div class="actions">
  <%= f.submit %>
</div>
<% end %>
Run Code Online (Sandbox Code Playgroud)

这是正确的方法(由脚手架生成):

<%= form_for(@post) do |f| %>
  <% if @post.errors.any? %>
    <div id="error_explanation">
      <h2><%= pluralize(@post.errors.count, "error") %> prohibited this post from being saved:</h2>

      <ul>
      <% @post.errors.full_messages.each do |msg| %>
        <li><%= msg %></li>
      <% end %>
      </ul>
    </div>
  <% end %>
 . . . 
Run Code Online (Sandbox Code Playgroud)

我理解我@post在后一个例子中使用了变量,但是我在前者中引用了什么变量来获取注释创建的错误消息?

Nic*_*nco 23

在表单中实现error_messages的最佳和最简洁的方法是在FormBuilder中实现error_messages.

例如,这是我为上一个项目实现的error_messages方法.通过实现自己的FormBuilder,您可以遵循webdesigner的规则和样式......以下是一个示例,它将输出ul/li中的错误列表以及一些自定义样式:

class StandardBuilder < ActionView::Helpers::FormBuilder
  def error_messages
    return unless object.respond_to?(:errors) && object.errors.any?

    errors_list = ""
    errors_list << @template.content_tag(:span, "There are errors!", :class => "title-error")
    errors_list << object.errors.full_messages.map { |message| @template.content_tag(:li, message) }.join("\n")

    @template.content_tag(:ul, errors_list.html_safe, :class => "error-recap round-border")
  end
end
Run Code Online (Sandbox Code Playgroud)

然后在我的表格中:

= f.error_messages
Run Code Online (Sandbox Code Playgroud)

就这样.


Luk*_*kas 13

我很确定你需要做的就是参考 @post.comments

所以你可以这样做:

<% @post.comments.each do |comment| %>
    <% if comment.errors.any? %>

    <% comment.errors.full_messages.each do |msg| %>
        <li><%= msg %></li>
    <% end %>

    <% end %>
<% end %>
Run Code Online (Sandbox Code Playgroud)

或者只是将所有错误拉出来:

comment_errors = @post.comments.map(&:errors)
Run Code Online (Sandbox Code Playgroud)

然后在显示逻辑中循环它们以输出每个注释错误.


Jus*_*ner 7

此功能作为独立的gem dynamic_form存在.

将以下内容添加到您的 Gemfile

gem 'dynamic_form'
Run Code Online (Sandbox Code Playgroud)

github页面:

DynamicForm拥有一些帮助您处理Rails3模型的帮助方法,它们是:

  • input(record, method, options = {})
  • form(record, options = {})
  • error_message_on(object, method, options={})
  • error_messages_for(record, options={})

它还增加了f.error_messagesf.error_message_on你的形式建设者.


bun*_*ich 0

我刚刚研究了 docrails github 问题,他们决定删除 f.error_messages,而不是解释如何对评论进行验证。