如何自定义simple_form以在span标题中输出错误文本

时间:2012-01-03 15:33:50

标签: ruby-on-rails simple-form

默认情况下,simple_form会以这种形式生成错误消息:

 <span class="error">"error_text"</span>

但我需要的是:

 <span class="error" title="error_text"></span>

所以它只是一个带背景图片的跨度,当你将鼠标悬停在它上面时显示错误信息

我研究了这个(Customize error message with simple_form)问题的答案,但它似乎没有包含我需要的内容:接受的答案建议自定义config/initializers/simple_form.rb。但我无法确定你是如何从那里做到的,它只是允许更改包含错误消息的标签,它的类以及要显示的消息。

2 个答案:

答案 0 :(得分:2)

这是我的同事(有经验的人)处理这个问题的方式:

Added custom_errors.rb to lib/simple_form

module SimpleForm
  module Components
    module CustomErrors
      include SimpleForm::Helpers::HasErrors

      def custom_error
        enabled_error
      end

      def error_tag
        options[:error_tag] || SimpleForm.error_tag
      end

      def error_text
        if options[:error_prefix]
          options[:error_prefix] + " " + errors.send(error_method)
        else
          errors.send(error_method)
        end
      end

      def error_method
        options[:error_method] || SimpleForm.error_method
      end

      def error_html_options
        html_options_for(:error, [SimpleForm.error_class])
      end

      protected

      def enabled_error
        # We need '<span title="Blah!"></span>'
        template.content_tag(error_tag, '', error_html_options.merge({:title => error_text})) if has_errors?
      end

      def disabled_error
        nil
      end

      def errors
        @errors ||= (errors_on_attribute + errors_on_association).compact
      end

      def errors_on_attribute
        object.errors[attribute_name]
      end

      def errors_on_association
        reflection ? object.errors[reflection.name] : []
      end
    end
  end

  module Inputs
    class Base
      include SimpleForm::Components::CustomErrors
    end
  end
end

答案 1 :(得分:0)

如果你无法自定义simple_form来做你需要的事情。您可以使用一些简单的javascript(jquery示例)来处理这个问题:

 //after the page loads, put the span's text in the title attribute and clear its text.
 $(function(){
   var $eSpan = $('.error:first');
   $eSpan.attr('title', $eSpan.text()).empty();
 })