[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 とか別のメソッド作ったほうが良かったかもとか思ったり・・・
元のメソッド使う事なんかないからまあいいか。(;´Д`)