« MovabelTypeで、「改行を変換する」関連プラグイン | メイン | validates_date_timeプラグイン »

error_message_onを、full_messageにするプラグイン

[ruby] [rails] [plugin] [rails_plugin]

error_message_on メソッドを使ってエラーメッセージを表示する場合に、ちょっとした問題に遭遇。


      def error_message_on(object, method, prepend_text = "", append_text = "", css_class = "formError")
        if errors = instance_variable_get("@#{object}").errors.on(method)
          content_tag("div", "#{prepend_text}#{errors.is_a?(Array) ? errors.first : errors}#{append_text}", :class => css_class)
        end
      end

これだと、毎回、prepend_text、append_textを指定してメッセージを表示しないといけない・・・

これはめんどくさいと言うことで、プラグインを作ってみました。


$ ./script/generate plugin error_message_on

とかして適当に名前を付けたプラグインを作成して、
lib以下にできた error_message_on.rb に、下のコードを張りつけます。


# ErrorMessageOn
ActiveRecord::Errors.class_eval do

  def full_messages_on(attribute)
    if @errors[attribute.to_s].nil?
      nil
    elsif @errors[attribute.to_s].length == 1
     ((attribute.to_s == "base" ? "" : @base.class.human_attribute_name(attribute.to_s)) + @errors[attribute.to_s].first)
    else
      @errors[attribute.to_s].map{|msg| ((attribute.to_s == "base" ? "" : @base.class.human_attribute_name(attribute.to_s)) + msg)}
    end
  end

end


ActionView::Helpers::ActiveRecordHelper.module_eval do
  alias_method :_error_message_on, :error_message_on

  def error_message_on(object, method, prepend_text = "", append_text = "", css_class = "formError")
    if errors = instance_variable_get("@#{object}").errors.full_messages_on(method)
      content_tag("div", "#{prepend_text}#{errors.is_a?(Array) ? errors.first : errors}#{append_text}", :class => css_class)
    end
  end

end

init.rbを編集して、requireするのを忘れないように。


# Include hook code here
require_dependency 'error_message_on' if defined? ActiveRecord::Base

これで、error_message_on でも、full_message が表示されるようになります。
この記事を書いてて思ったんですが、メソッド上書きするよりも full_error_message_on とか別のメソッド作ったほうが良かったかもとか思ったり・・・

元のメソッド使う事なんかないからまあいいか。(;´Д`)

トラックバック

このエントリーのトラックバックURL:
http://i-am.web777.net/mt/mt-tb.cgi/6

コメントを投稿