简体   繁体   中英

Devise: How to override devise error messages on password change

How can I customize error messages to override devise passwords controller?

class PasswordsController < Devise::PasswordsController
  def create
    self.resource = resource_class.send_reset_password_instructions(params[resource_name])

    if resource.errors.empty?
      set_flash_message(:notice, :send_instructions) if is_navigational_format?
      respond_with resource, :location => home_path
    else
      binding.pry
      flash[:devise_password_error] =  (resource.errors.map do |key, value|
        value.capitalize
      end).flatten.join('|')
      redirect_to home_path and return
    end
  end
  def edit
    self.resource = resource_class.new
    resource.reset_password_token = params[:reset_password_token]
  end
end

resource.errors is available in this method but it contains default messages such as Email not found and Email can't be blank . i need to customize this messages. I've tried to remove :validatable from my user model and add custom validators but this works only for my custom registrations controller derived from Devise::RegistrationsController and not for custom passwords controller.

Is there any solution?

The answer is to modify config/locales/devise.en.yml but you must add the settings, they are not there by default.

en:
  activerecord:
    errors:
      models:
        user:
          attributes:
            password:
              confirmation: "does not match"
              too_short: "is too short (minimum is %{count} characters)"

Credit for this goes to Vimsha who answered virtually the same question for me.

Devise messages are located in config/locales/devise.en.yml

I'm not sure which message you're trying to override, but that's where you want to do that.

It's not ideal, but based on this related ticket I've got it working with the following (which I know is a bit of a hack, but it works):

module DeviseHelper
  def devise_error_messages!
     resource.errors.full_messages.map { |msg| msg == 'Email not found' ? 'The email address you entered could not be found. Please try again with other information.' : msg }.join('<br/>')
  end
end

Put this in a module called devise_helper.rb in your /app/helpers directory

Add this to your routes.rb

devise_for :users, controllers: { passwords: 'passwords' }

or

devise_for :users, :controllers => { :passwords => 'passwords' }

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM