Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Display link in Rails form error message

On our sign-up form, we validates_uniqueness_of :email

When the a user is attempting to use our sign up form and they specify an existing email address, I'd like them to see an error message like this

This email address is already in use. If you're having trouble logging in, you can reset your password

Obviously, I'd like to use the named route for the link, but my User model does not have access to it. How can I accomplish this?

Side note: We will be offering translations for our app soon and all of these error messages will end up in YAML files. Can I somehow inject my new_password_url in a message in my YAML locale files? (e.g., config/locales/en.yml)

like image 659
maček Avatar asked Mar 16 '11 16:03

maček


1 Answers

I know this is an old question, but for future users who want to insert a link into an error message, here are some guidelines that worked for me.

First, the I18n error messages are assumed html safe already, so you can go ahead and write a suitable error message. In this example, I'm changing an "email is taken" message.

# config/locales/en.yml
activerecord:
  errors:
    models:
      user:
        attributes:
          email:
            taken: 'has already been taken. If this is your email address, try <a href="%{link}">logging in</a> instead.'

Notice the interpolated variable %link.

Now all you need to is pass in a value for that variable in your validator, like so:

# app/models/user.rb
validates :email, :uniqueness => {:link => Rails.application.routes.url_helpers.login_path}

(By default, any options you pass in here will automatically be sent over to the I18n translator as variables, including some special pre-populated variables like %value, %model, etc.)

That's it! You now have a link in your error message.

like image 140
Elliot Nelson Avatar answered Sep 17 '22 12:09

Elliot Nelson