2012-06-12 4 views
-3

Я пытался добавить пароль для пользователей, которые забыли пароль. Пользователи нажми на забытый пароль? на странице регистрации. Затем пользователь вводит свой адрес электронной почты и щелкает сброс пароля, который создает токен и отправляет электронное письмо со ссылкой для сброса пароля. По большей части он работает ТОЛЬКО, когда ящик электронной почты пуст или имеет ровно 6 случайных букв/цифр, но он не работает, когда пользователь помещает свой адрес электронной почты и щелкает сброс пароля, он вызывает сообщение об ошибке:1) PasswordResets адрес электронной почты пользователя при запросе пароля сброс

**Validation failed: Password can't be blank 
Password cant be blank, password is too short(6 min)** 

изменяя user.rb проверяющий: пароль, наличие: истинно, длина: {минимум: 6} подтверждает: password_confirmation, наличие: истинный

Я получил различные ошибки, есть в любом случае для исключения этой проверки из этой формы сбрасывания пароля

app/models/user.rb:30:in `send_password_reset' 
app/controllers/password_resets_controller.rb:7:in `create' 

Ошибка в этой ошибке в видео 275 Как я тестирую. на 11:20

Failure/Error: click_button "Сброс пароля" ActiveRecord :: RecordInvalid: Не удалось выполнить проверку пароля не может быть пустым, пароль слишком короткий (минимум 6 символов), подтверждение пароля не может быть пустым

 # ./app/models/user.rb:30:in `send_password_reset' 
    # ./app/controllers/password_resets_controller.rb:7:in `create' 
    # (eval):2:in `click_button' 
    # ./spec/requests/password_resets_spec.rb:9:in `block (2 levels) in <top (required)>' 

Законченный в 13.66 секунд 95 примеров, 1 недостаточность

Это часть кода используется.

user.rb

# == Schema Information 
    # 
    # Table name: users 
    # 
    # id   :integer   not null, primary key 
    # name  :string(255) 
    # email  :string(255) 
    # created_at :datetime  not null 
    # updated_at :datetime  not null 
    # 

    class User < ActiveRecord::Base 
    attr_accessible :name, :email, :password, :password_confirmation 
    has_secure_password 

     before_save { |user| user.email = email.downcase } 
     before_save :create_remember_token 

     validates :name, presence: true, length: { maximum: 50 } 
     VALID_EMAIL_REGEX = /\A[\w+\-.][email protected][a-z\d\-.]+\.[a-z]+\z/i 
     validates :email, presence: true, 
       format:  { with: VALID_EMAIL_REGEX }, 
       uniqueness: { case_sensitive: false } 
     validates :password, presence: true, length: { minimum: 6 } 
     validates :password_confirmation, presence: true 

     def send_password_reset 
     generate_token(:password_reset_token) 
     self.password_reset_sent_at = Time.zone.now 
     save! 
     UserMailer.password_reset(self).deliver 
     end 

     def generate_token(column) 
     begin 
      self[column] = SecureRandom.urlsafe_base64 
     end while User.exists?(column => self[column]) 
     end 

     def self.search(search) 
     if search 
      find(:all, :conditions => ['name LIKE ?', "%#{search}%"]) 
     else 
      find(:all) 
     end 
     end 

     private 

     def create_remember_token 
      self.remember_token = SecureRandom.urlsafe_base64 
     end 
    end 

password_resets_controller.rb

  class PasswordResetsController < ApplicationController 
     def new 
     end 

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

     def edit 
     @user = User.find_by_password_reset_token!(params[:id]) 
     end 
    end 

password_resets_spec

require 'spec_helper' 

    describe "PasswordResets" do 
     it "emails user when requesting password reset" do 
     user = Factory(:user) 
     visit signin_path 
     click_link "password" 
     fill_in "Email", :with => user.email 
     click_button "Reset Password" 
     current_path.should eq(root_path) 
     page.should have_content("Email sent") 
     last_email.to.should include(user.email) 
     end 
    end 

user_spec.rb

# == Schema Information 
    # 
    # Table name: users 
    # 
    # id   :integer   not null, primary key 
    # name  :string(255) 
    # email  :string(255) 
    # created_at :datetime  not null 
    # updated_at :datetime  not null 
    # 

    require 'spec_helper' 

    describe User do 

     describe "#send_password_reset" do 
     let(:user) { Factory(:user) } 

     it "generates a unique password_reset_token each time" do 
      user.send_password_reset 
      last_token = user.password_reset_token 
      user.send_password_reset 
      user.password_reset_token.should_not eq(last_token) 
     end 

     it "saves the time the password reset was sent" do 
      user.send_password_reset 
      user.reload.password_reset_sent_at.should be_present 
     end 

     it "delivers email to user" do 
      user.send_password_reset 
      last_email.to.should include(user.email) 
     end 
     end 

     before do 
     @user = User.new(name: "Example User", email: "[email protected]", 
       password: "foobar", password_confirmation: "foobar") 
     end 

     subject { @user } 

     it { should respond_to(:name) } 
     it { should respond_to(:email) } 
     it { should respond_to(:password_digest) } 
     it { should respond_to(:password) } 
     it { should respond_to(:password_confirmation) } 
     it { should respond_to(:remember_token) } 
     it { should respond_to(:authenticate) } 

     it { should respond_to(:admin) } 
     it { should respond_to(:authenticate) } 

     it { should be_valid } 
     it { should_not be_admin } 

     describe "with admin attribute set to 'true'" do 
     before { @user.toggle!(:admin) } 

     it { should be_admin } 
     end 

     describe "when name is not present" do 
     before { @user.name = " " } 
     it { should_not be_valid } 
     end 

     describe "when email is not present" do 
     before { @user.email = " " } 
     it { should_not be_valid } 
     end 

     describe "when name is too long" do 
     before { @user.name = "a" * 51 } 
     it { should_not be_valid } 
     end 

     describe "when email format is invalid" do 
     it "should be invalid" do 
      addresses = %w[[email protected],com user_at_foo.org [email protected] 
        [email protected]_baz.com [email protected]+baz.com] 
      addresses.each do |invalid_address| 
      @user.email = invalid_address 
      @user.should_not be_valid 
      end  
     end 
     end 

     describe "when email format is valid" do 
     it "should be valid" do 
      addresses = %w[[email protected] [email protected] [email protected] [email protected]] 
      addresses.each do |valid_address| 
      @user.email = valid_address 
      @user.should be_valid 
      end  
     end 
     end 

     describe "when email address is already taken" do 
     before do 
      user_with_same_email = @user.dup 
      user_with_same_email.email = @user.email.upcase 
      user_with_same_email.save 
     end 

     it { should_not be_valid } 
     end 

     describe "email address with mixed case" do 
     let(:mixed_case_email) { "[email protected]" } 

     it "should be saved as all lower-case" do 
      @user.email = mixed_case_email 
      @user.save 
      @user.reload.email.should == mixed_case_email.downcase 
     end 
     end 

     describe "when password is not present" do 
     before { @user.password = @user.password_confirmation = " " } 
     it { should_not be_valid } 
     end 

     describe "when password doesn't match confirmation" do 
     before { @user.password_confirmation = "mismatch" } 
     it { should_not be_valid } 
     end 

     describe "when password confirmation is nil" do 
     before { @user.password_confirmation = nil } 
     it { should_not be_valid } 
     end 

     it { should respond_to(:authenticate) } 

     describe "with a password that's too short" do 
     before { @user.password = @user.password_confirmation = "a" * 5 } 
     it { should be_invalid } 
     end 

     describe "return value of authenticate method" do 
     before { @user.save } 
     let(:found_user) { User.find_by_email(@user.email) } 

     describe "with valid password" do 
      it { should == found_user.authenticate(@user.password) } 
     end 

     describe "with invalid password" do 
      let(:user_for_invalid_password) { found_user.authenticate("invalid") } 

      it { should_not == user_for_invalid_password } 
      specify { user_for_invalid_password.should be_false } 
     end 
     end 

     describe "remember token" do 
     before { @user.save } 
     its(:remember_token) { should_not be_blank } 
     end 
    end 
+0

Причина, по которой вы получаете downvoted, потому что ваш вопрос очень плохо описан. Честно говоря, я не уверен, что вы просите (я могу догадаться, но это не главное) и почему вы дали код, который вы сделали. Попробуйте снова (лучше, пожалуйста) или отредактируйте вопрос. –

+0

@theoscholiadis idk, почему я получаю сообщение об ошибке, которое я получаю, я думаю, мой вопрос заключается в том, как я его исправить. –

+0

@ TheoScholiadis Я заметил, что когда я удаляю из user.rb length: {minimum: 6}, он больше не имеет этой части ошибки, есть ли способ оправдать эти проверки при отправке Сбросить пароль? –

ответ

0

На первый взгляд при сбросе пароля ваш код пытается сохранить пустой пароль (отсюда и ваша ошибка). Попробуйте отладить его по одной строке за раз, используя logger.debug, чтобы попытаться найти, в какой момент ваш код сводит на нет пароль перед его сохранением. Я не использовал UserMailer, но похоже, что ошибка связана с линией UserMailer.password_reset(self).deliver. Если вы написали метод, я бы сначала посмотрел на отладку. Если он был автоматизирован, попробуйте и отлаживайте разделы, которые задают все параметры для почтовой программы, чтобы сгенерировать токен и сбросить пароль.

Надеюсь, это поможет.

2

В вашем send_password_reset метод вы используете:

save! 

использовать вместо

save!(validate: false) 

и все будет работать. Проблема в том, что вы пытаетесь сохранить модель, и проверки мешают.Вам не нужно проверять что-либо в методе send_password_reset, поскольку от пользователя ничего не генерируется, поэтому нет никакой опасности недействительной информации, сохраняемой в базе данных.

Смежные вопросы