最近、パスワード検証のコードを以下のコードに変更して、パスワードとパスワードの確認を必要としないフォームを作成できるようにしました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 %>
追加のファイルが必要な場合はお知らせください。
編集:実用的なソリューションでコードを変更しました。
ありがとう。