1

最近、パスワード検証のコードを以下のコードに変更して、パスワードとパスワードの確認を必要としないフォームを作成できるようにしましたHow to change one attribute in a model using form_for in Rails .

暗号化されたパスワードを生成するために has_secure_password を使用しなかったことに注意してください。RailsTutorial の Hartl ごとに SHA2.hexdigest を使用しました。

user.rb

before_save :encrypt_password, :unless => Proc.new { |u| u.password.blank? }
validates_presence_of :password, :if => :should_validate_password?
validates_confirmation_of :password, :if => :should_validate_password?
validates_length_of :password, :minimum => 6, :maximum => 40, :allow_blank => true
#changing :allow_blank from false to true above fixed my problem.

def should_validate_password?
  updating_password || new_record?
end

私はこのRailscastをRemember Me/Reset Password http://railscasts.com/episodes/274-remember-me-reset-passwordでフォローしましたが、このエラーが発生し続けます:

ActiveRecord::RecordInvalid in PasswordResetsController#create

Validation failed: Password is too short (minimum is 6 characters)

これは、既存のユーザーの auth_tokens を生成しようとしたときと、リセット リンク用にメールを送信しようとしたときに発生しました。コードの一部をコメントアウトすることで、この検証を一時的に削除することができ、すべて正常に機能しました。

ユーザー アカウントに再度サインインして、パスワードが範囲内 (9 文字の長さ) になるように変更しようとしましたが、同じ長さの検証エラー メッセージが表示されます。

任意のヒント?

問題の原因がどこにあるのかわかりません。パスワードが検証される理由がわかりません。

パスワード リセット コントローラーでの作成アクションは次のとおりです。

def create
  user = User.find_by_email(params[:email])
  user.send_password_reset if user
  redirect_to root_path, :notice => "Email sent with password reset"
end

これが私のパスワードリセットフォームです:

<%= form_tag password_resets_path, :method => :post do %>
  <div class="field">
    <%= label_tag :email %>
    <%= text_field_tag :email, params[:email] %>
  </div>
  <div class="actions"><%= submit_tag "Reset Password" %></div>
<% end %>

追加のファイルが必要な場合はお知らせください。

編集:実用的なソリューションでコードを変更しました。

ありがとう。

4

2 に答える 2

1

:should_validate_password は必要ありませんか?

次のように Proc を追加しました。

validates :password, length: { minimum: 6 }, unless: Proc.new { |user| user.password.nil? }
validates :password_confirmation, presence: true, unless: Proc.new { |user| user.password.nil? }

または、これを使用してグループ化できますwith_options

参照: http://guides.rubyonrails.org/v3.2.13/active_record_validations_callbacks.html

于 2012-07-04T15:07:32.503 に答える
1

password_confirmation を検証するため、エラーが発生します。これは、その範囲内の値も期待することを意味します。

次のようにして修正できます。

validates :password,  length:     { minimum: 8, allow_nil: true },
                      confirmation: true
于 2012-06-13T09:04:17.460 に答える