Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
1.2k views
in Technique[技术] by (71.8m points)

ruby on rails - ActiveRecord validates... custom field name

I would like to fix up some error messages my site generates. Here is the problem:

class Brand < ActiveRecord::Base
    validates_presence_of :foo
    ...
end

My goal is to make a message "Ticket description is required" instead of "Foo is required" or may not be blank, or whatever.

The reason this is so important is because lets say previously the field was ticket_summary. That was great and the server was coded to use that, but now due to crazy-insane business analysts it has been determined that ticket_summary is a poor name, and should be ticket_description. Now I don't necessarily want to have my db be driven by the user requirements for field names, especially since they can change frequently without functionality changes.

Is there a mechanism for providing this already?

To Clarify

:message => does not seem to be the correct solution, :message will give me "Foo [message]" as the error, I am looking to change the messages generated field name, not the actual message itself (though I will settle for having to change the whole thing).

See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

Add this to your config/locales/en.yml file:

en:
  activerecord:
    errors:

      # global message format 
      format: #{message}

      full_messages:
        # shared message format across models
        foo:
          blank: Ticket description is required

        # model specific message format
        brand:
          zoo:
            blank: Name is required

Now change your validation message to refer to the new message format:

validates_presence_of :bar, :message => "Empty bar is not a good idea"
validates_presence_of :foo, :message => "foo.blank"
validates_presence_of :zoo, :message => "brand.zoo.blank"

Lets try the code:

b = Brand.new
b.valid?
b.errors.full_messages
#=> ["Ticket description is required", 
#     "Empty bar is not a good idea",
#     "Name is required"]

As demonstrated above, you can customize the error message format at three levels.

1) Globally for all the ActiveRecord error messages

  activerecord:
    errors:
      format: #{message}

2) Shared error messages across models

  activerecord:
    errors:
      full_messages:
        foo:
          blank: Ticket description is required

3) Model specific messages

  activerecord:
    errors:
      full_messages:
        brand:
          zoo:
            blank: Name is required

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...