2014-09-09 2 views
0

Работа через railstutorial.org. В настоящее время на странице «Обновить профиль». При оставлении полей Password и Password Confirmation пустым является ошибка только Password is too short, хотя в учебнике снимок экрана Password confirmation can't be blank присутствует. Но он появляется, когда заполняется поле Password и поле Password Confirmation остается пустым.Сообщение «Подтверждение пароля» не отображается, когда оба поля пароля пустые

edit.html.erb:

<% provide(:title, "Edit user") %> 
<h1>Update your profile</h1>          

<div class="row"> 
    <div class="span6 offset3"> 
    <%= form_for(@user) do |f| %> 
     <%= render 'shared/error_messages' %> 

     <%= f.label :name %> 
     <%= f.text_field :name %> 

     <%= f.label :email %> 
     <%= f.text_field :email %> 

     <%= f.label :password %> 
     <%= f.password_field :password %> 

     <%= f.label :password_confirmation, "Confirm Password" %> 
     <%= f.password_field :password_confirmation %> 

     <%= f.submit "Save changes", class: "btn btn-large btn-primary" %> 
    <% end %> 

    <%= gravatar_for @user %> 
    <a href="http://gravatar.com/emails">change</a> 
    </div> 
</div> 

users_controller.rb:

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

    def update 
    @user = User.find(params[:id]) 
    if @user.update_attributes(user_params) 
     flash[:success] = "Profile updated" 
     redirect_to @user 
    else 
     render 'edit' 
    end 
    end 

    private 

    def user_params 
     params.require(:user).permit(:name, :email, :password, 
            :password_confirmation) 
    end 
. 
. 
. 

user.rb:

class User < ActiveRecord::Base 
    has_secure_password 
    before_save { self.email = email.downcase } 
    validates :name, presence: true, length: { maximum: 50 } 
    VALID_EMAIL_REGEX = /\A[\w+\-.][email protected][a-z\d\-]+(?:\.[a-z\d\-]+)*\.[a-z]+\z/i 
    validates :email, presence: true, 
        format: { with: VALID_EMAIL_REGEX }, 
        uniqueness: { case_sensitive: false } 
    validates :password, length: { minimum: 6 } 

    before_create :create_remember_token 

    def User.new_remember_token 
    SecureRandom.urlsafe_base64 
    end 

    def User.digest(token) 
    Digest::SHA1.hexdigest(token.to_s) 
    end 

    private 

    def create_remember_token 
     self.remember_token = User.digest(User.new_remember_token) 
    end 
end 
+3

Как выглядит ваша модель пользователя? Здесь вы указываете, что нужно проверять. –

+0

@SunilD. Добавлено! Я не думал, что это помогло бы, потому что я не коснулся его в нескольких главах, и сообщение, по крайней мере, появляется, когда поле «Пароль» заполнено чем-то. – sivanes

ответ

1

Ваш User.rb модели синхронизирован с одной MHartl uses at that point in the tutorial. В частности, обратите внимание, что у него есть явный validates :password_confirmation, presence: true в дополнение к validates :password, length: { minimum: 6 }. Когда вы вызываете @ user.update_attributes, он попадает на эти валидаторы и, в его случае, оба терпят неудачу, тогда как в вашей модели User.rb нет проверки достоверности присутствия.

Когда у вас введено поле пароля, вы делаете валидаторы, определенные в has_secure_password, а не в своей модели, поэтому они появляются.

+0

aha! Я видел другие вопросы по аналогичной проблеме на SO и искал по курсу для любого упоминания о добавлении ': password_confirmation' в файл' user.rb', как это было сделано в других примерах, и ничего не нашел. Полезно знать, что вы можете сравнить окончательный код в конце каждого нажатия на github и поблагодарить вас за разъяснение по проверке 'has_secure_password'. – sivanes

0

Убедитесь, что вы включили пароль и password_confirmation в ваших допустимых параметров в вас контроллер:

private 

    def user_params 
    params.required(:user).permit(:name, :email, password,:password_confirmation) 
    end 

EDIT:

Как другой уже указал, вы пропустите валидация password_confirmation

validates :password_confirmation, presence: true 
+0

Вопрос говорит, что сообщение «Подтверждение пароля» не отображается, когда оба поля пароля пустые », и это не решает проблему. Проблема связана с немощными параметрами модели – Mandeep

+0

@PauloFigaldo yep, у меня уже есть все, что вы предложили – sivanes