2012-02-17 36 views
15

オーバーライドされたエラーメッセージをカスタマイズするにはどうすればよいですか?パスワード変更時にエラーメッセージを上書きする方法

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この方法で提供されていますが、それは、そのようなEmail not foundEmail can't be blankとして、デフォルトのメッセージが含まれています。私はこのメッセージをカスタマイズする必要があります。私はユーザーモデルから:validatableを削除しようとしましたが、カスタムバリデーターを追加しようとしましたが、これはDevice :: RegistrationsControllerから派生した私のカスタム登録コントローラーでのみ動作し、カスタムパスワードコントローラーでは動作しません。

解決策はありますか?

+0

は、あなたがこの問題を解決しましたか? –

+0

私はこれが古いことを知っていますが、より一般的でクリーンなアプローチについては、[この回答](http://stackoverflow.com/a/18578028/1964165)をチェックしてください。 – akhanubis

答えて

7

工夫メッセージがのconfig /ロケール/ devise.en.yml

に位置している私は、あなたが上書きしようとしているどのメッセージわからないんだけど、あなたがそれをしたいところです。

+3

オーバーライドしたいメッセージはそこにありません。私が変更したいこれらのメッセージは、検証が失敗したときに使われるデフォルトのメッセージであり、 'config/locales/devise.en.yml'はデバイス情報メッセージを含んでいます。 – RomanKapitonov

+0

これらのメッセージは実際にそこにはありませんが、追加することができます。上記の私の答えを参照してください。 – Justin

0

それは理想的ではないですが、this related ticketに基づいて、私はそれが(私はハックのビットですが、それは作品を知っている)、次の作業ガット:と呼ばれるモジュールでこれを入れて

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 

彼らは、デフォルトでは存在しない、あなたの/app/helpersディレクトリ内devise_helper.rb

15

答えはのconfig /ロケール/ devise.en.ymlを変更することですが、設定を追加する必要があります。このため

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

クレジットは私のためにほぼ同じquestionに答えVimshaに行きます。

+1

最小値をハードコーディングするのではなく、エラーメッセージに%{count}を使用する必要があります。カウントは範囲バリデータによってI18n.tに渡されるため、常にデバイス設定と一致します。 – ReggieB

0

あなたのroutes.rbをにこれを追加

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

または

devise_for :users, :controllers => { :passwords => 'passwords' } 
関連する問題