Is there an easy way to customize the display name of the attributed
used in a validation error message. For example, let’s say I have an
active record with the attribute :msg that is validated for presence.
If is doesn’t exist I don’t want the user to see “msg can’t be
blank!” I want it to say “Message can’t be blank!” Is there an easy
way to do that?
On Fri, Sep 25, 2009 at 4:49 PM, drewB [email protected] wrote:
Is there an easy way to customize the display name of the attributed
used in a validation error message. For example, let’s say I have an
active record with the attribute :msg that is validated for presence.
If is doesn’t exist I don’t want the user to see “msg can’t be
blank!” I want it to say “Message can’t be blank!” Is there an easy
way to do that?
Have you read the validation documentation?
All of the Rails validators support a :message option, for example
look at validates_presence_of:
http://api.rubyonrails.org/classes/ActiveRecord/Validations/ClassMethods.html#M002164
See where it says “message - A custom error message (default is:
“can‘t be blank”).” ? That means when you write
validates_presence_of :foo, :message => “Message can’t be blank!”
–
Greg D.
http://destiney.com/
I am aware of the :message option. What I was hoping to do is be able
to use many of the default messages and just change the attribute name
displayed. For example, something like:
attr_display_name :msg “Message”
I responded just a bit ago, but I don’t see my response, so hopefully
there won’t be two responses…
Essentially, Drew, you can map the column to be something else when
you call “humanize” on it. Try this:
class Post < ActiveRecord::Base
HUMANIZED_COLUMNS = {:msg => “Message”}
def self.human_attribute_name(attribute)
HUMANIZED_COLUMNS[attribute.to_sym] || super
end
end
HTH,
Richard
Hi drewB,
You can change the “humanized” version of that symbol when it’s
accessed via human_attribute_name.
Try this:
class Post < ActiveRecord::Base
HUMANIZED_COLUMNS = {:msg => “Message”}
def self.human_attribute_name(attribute)
HUMANIZED_COLUMNS[attribute.to_sym] || super
end
end
HTH,
Richard
I responded just a bit ago, but I don’t see my response, so hopefully
there
won’t be two responses…
Essentially, Drew, you can map the column to be something else when you
call
“humanize” on it. Try this:
class Post < ActiveRecord::Base
HUMANIZED_COLUMNS = {:msg => “Message”}
def self.human_attribute_name(attribute)
HUMANIZED_COLUMNS[attribute.to_sym] || super
end
end
HTH,
Richard
That is exactly what I was looking for! Thank you!
Hi
I was just trying this My models and relations are as
company has_many users
user belongs_to company
And when saving a user a company is also saved So in user model I
have
validates_associated :company
The solution works perfectly for user model attributes. But it
is not working for company attributes. For example in companies table i
have address_city field And as the solution suggests I add to company
model below code
HUMANIZED_COLUMNS = {:address_city => “City”}
def self.human_attribute_name(attribute)
HUMANIZED_COLUMNS[attribute.to_sym] || super
end
But this is not working It shows Address city .But I need is
City. Please help
Thanks
Tom
Hi
One more thing is ,in order to show validates_associated error
message than the regular message “is invalid” I am using the hack in
environment.rb like
module ActiveRecord::Validations::ClassMethods
def validates_associated(*associations)
associations.each do |association|
class_eval do
validates_each(associations) do |record, associate_name,
value|
associates = record.send(associate_name)
associates = [associates] unless
associates.respond_to?(‘each’)
associates.each do |associate|
if associate && !associate.valid?
associate.errors.each do |key, value|
record.errors.add(key, value)
end
end
end
end
end
end
end
end
I could solve the problem the following way. But I dont know whether
this the right approach.Please correct if wrong
module ActiveRecord::Validations::ClassMethods
def validates_associated(*associations)
associations.each do |association|
class_eval do
validates_each(associations) do |record, associate_name,
value|
associates = record.send(associate_name)
associates = [associates] unless
associates.respond_to?(‘each’)
associates.each do |associate|
if associate && !associate.valid?
associate.errors.each do |key, value|
humanized_columns = {:address_city =>
“City”,:phone_oofice => “Office Phone Number”}
record.errors.add(key, value,{:attribute =>
humanized[key.to_sym] || human_attribute_name(key.to_s)})
end
end
end
end
end
end
end
end
Thanks
Tom
I would just like to add that those who uses I18n can easily add these
model “translations” to the localization file like so:
en:
activerecord:
models:
user: “User”
company: “Company”
attributes:
user:
login: “Username”
password. “Password”
company:
name: “Company name”
I prefer this method over having the HUMANIZED_COLUMNS in every model.
I18n can also be used to customize error messages, if you dont like the
default ones (like “is invalid”). This is certanly a lot cleaner than
hacking active record.
Hi
Thanks for replying back.Can you please paste a good link explains how
to do this?
Tom
You mean how to use I18n?
Ryan B. has a screen cast on it:
And then there’s the official I18n guide
Sharagoz – wrote:
You mean how to use I18n?
Ryan B. has a screen cast on it:
#138 I18n - RailsCasts
And then there’s the official I18n guide
Rails Internationalization (I18n) API — Ruby on Rails Guides
Unfortunately, Rails’ official I18N is quite cumbersome. I highly
recommend fast_gettext.
Best,
–Â
Marnen Laibow-Koser
http://www.marnen.org
[email protected]