30

When a user tries to create a record with a name that already exists, I want to show an error message like:

name "some name" has already been taken

I have been trying to do:

validates_uniqueness_of :name, :message => "#{name} has already been taken"

but this outputs the table name instead of the value of the name attribute

3 Answers 3

46

2 things:

  1. The validation messages use the Rails I18n style interpolation, which is %{value}
  2. The key is value rather than name, because in the context of internationalization, you don't really care about the rest of the model.

So your code should be:

validates_uniqueness_of :name, :message => '%{value} has already been taken'
Sign up to request clarification or add additional context in comments.

2 Comments

Nice! Definitely cleaner than my answer.
It may be useful to know that %{attribute} is also available for use.
26

It looks like you can pass a Proc to the message. When you do this, you get two parameters:

  1. A symbol along the lines of :activerecord.errors.models.user.attributes.name.taken
  2. A hash that looks something like `{:model=>"User", :attribute=>"Name", :value=>"My Name"}

So if you allow for two parameters on a proc, you can use the attributes[:value] item to get the name that was used:

validates_uniqueness_of :name, 
                        :message => Proc.new { |error, attributes| 
                          "#{attributes[:value]} has already been taken." 
                        }

1 Comment

In Rails 7.1, the first param is the object.
3

What version of Rails do you use?

If Rails 3. then as i understand you should use :message => '%{value} has already been taken'. I am not sure about Rails 2.3. - but in any case you can create your own custom validation that performs what you need.

1 Comment

for this application, i am using rails 2.3.4

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.