4

has_secure_password を使用して、ユーザーのパスワードとその確認を確認しています。私が抱えている問題は、エラーが発生した場合、フィールドが field_with_errors div でラップされていないことです。私は追加できることを知っています

validates_presence_of :password, :on => :create
validates_presence_of :password_confirmation, :on => :create

しかし、それは次のエラーメッセージを作成します:

パスワード ダイジェストを空白にすることはできません。
パスワードを空白にすることはできません。
パスワードの確認を空白にすることはできません

has_secure_password でエラーのあるフィールドを field_with_errors div でラップする、「パスワード ダイジェストを空白にすることはできません」を削除したいと思います。全体的にエラー。

ありがとう。

4

3 に答える 3

9

この機能を備えたSecurePasswordモジュールは非常にシンプルで、一見の価値があります。幸いなことに、マスターブランチ(Rails 4)ではvalidates_presence_of :password, :on => :create問題が解決しますが、それまでの間has_secure_password、ユーザーモデルのメソッドを自分で模倣することをお勧めします。

class User < ActiveRecord::Base
  attr_reader :password
  attr_accessible :password # ...
  validates_confirmation_of :password
  validates_presence_of :password, on: :create
  include ActiveModel::SecurePassword::InstanceMethodsOnActivation
end

またbcrypt、Gemfileにロードされていることを確認してください。

gem 'bcrypt-ruby', '~> 3.0.0', require: 'bcrypt'

お役に立てば幸いです。

于 2012-06-06T17:05:29.820 に答える
5

@ryanb が述べたように、validates_presence_of :passwordマスターでは修正されていますが、バックポートされません。その修正により、Password digest can't be blank.メッセージもクリアされます。

そのため、モデルには以下を追加する必要があります。

validates :password, presence: true, on: :create

@henrique-zambon が述べたように、. を追加する必要はありませんvalidates_presence_of :password_confirmation。追加メッセージを表示せずにパスワード確認フィールドを強調表示するには、エラーを表示したでそのフィールドにエラーを追加します。

次に、余分なPassword digest can't be blank.メッセージを非表示にするには、フォームの上部でそれを削除するだけです.

= form_for @user do |f|
  - if @user.errors.any?
    - @user.errors.delete(:password_digest)
    #error_explanation
      %h2= "#{pluralize(@user.errors.count, "error")} prohibited this user from being saved:"
      %ul
        - @user.errors.full_messages.each do |msg|
          %li= msg
    - @user.errors.add(:password_confirmation) if @user.errors.include?(:password)
于 2012-10-08T09:26:47.097 に答える
2

の存在を検証する必要はあり:password_confirmationませhas_secure_passwordん。

この RailsCast: Authentication in Rails 3.1を確認してください。

于 2012-06-06T04:34:14.730 に答える