Аутентификация разбита на разделы, проблема с изменением пароля - PullRequest
0 голосов
/ 13 мая 2011

Я создаю аутентификацию, с нуля, без Devise или Authlogic, которая сохранит три разные части моей таблицы :user независимо. Я пытаюсь получить его, чтобы сохранить несущественные данные, такие как реальное имя пользователя и возраст, без пароля. Если :user хочет изменить свои регистрационные данные, например, :loginname или :email, то им необходимо ввести свой :password, чтобы внести изменения. То же самое касается, если :user хочет изменить их :password. Вот модель для таблицы :user.

class User < ActiveRecord::Base
attr_accessor   :password, :old_password, :current_password
attr_accessible :loginname, :email, :password, :password_confirmation,
                 :name, :title_forName, :age_verify, :old_password, 
                 :current_password

email_regex = /\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z/i
loginname_regex = /\A[\w\d]+\z/i
password_regex = /\A(?=.*[\d])(?=.*[A-Z])([1-zA-Z0-1@*#$.]{6,20})\z/

validates :loginname, :presence     => true,
                      :format       => { :with => loginname_regex },
                      :length       => { :maximum => 30},
                      :uniqueness   => { :case_sensitive => false }
validates :email,     :presence     => true,
                      :format       => { :with => email_regex },
                      :uniqueness   => { :case_sensitive => false }
validates :password,  :presence     => true,
                      :on           => :create, 
                      :on           => :change_password_update,
                      :on           => :change_password,
                      # :on           => :update, #This fixes the problem with the password not being validated, but breaks everything else
                      :confirmation => true,
                      :length       => { :within => 6..20 },
                      :format       => { :with => password_regex }
validates :name,      :length       => { :maximum => 75 }
validates :old_password, :presence  => true,
                         :on        => :change_password_update,
                         :on        => :change_password,
                         :format    => { :with => password_regex }
validates :current_password, :presence  => true,
                         :on        => :change_login_update,
                         :on        => :change_login,
                         :format    => { :with => password_regex }

before_save do
     if ( !self.password.blank? || !self.password_confirmation.blank?) #This will keep from a blank password being saved to an encryption.
        :encrypt_password
    end
end

Это секция обновления на контроллере для :user

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

конец

Это для :user секции входа

def change_login_update
    if @user.has_password?(params[:user][:current_password])
        if @user.update_attributes(params[:user])
        flash[:success] = "Login details updated."
        redirect_to @user
        else
        @title = "Change Login Details"
        render 'change_login'
        end
    else
        flash[:notice] = "Password Didn't Match Our Records"
        @title = "Change Login Details"
        render 'change_login'
    end
  end

И это для секции :password_change на контроллере :users

def change_password_update
    if @user.has_password?(params[:user][:old_password])
        if @user.update_attributes(params[:user])
        flash[:success] = "Password updated."
        redirect_to @user
        else
        @title = "Change Password"
        render 'change_password'
        end
    else
        flash[:notice] = "Original Password Didn't Match Our Records"
        @title = "Change Password"
        render 'change_password'
    end   
  end

1 (Обновление несущественных вещей) - Кнопка отправки на главной странице редактирования пользователя, где она будет изменять только то, что не влияет на вход в систему :user, работает без инцидентов и все, что нужно изменить, обновляется.

2 (Обновление данных для входа в систему) - кнопка отправки с именем "change_login_update", :flash работает правильно, а проверка полей для :email и :loginname также работает. После нажатия кнопки «Отправить» у пользователя запрашивается правильный пароль, и он выполняет сопоставление пароля перед сохранением данных, но не проверяет, имеют ли входные данные для :current_password правильный формат. Похоже, это проблема с полями :on, которые были добавлены в модель :user, не работает.

3 (Обновление пароля) - Кнопка отправки с именем "change_password_update", :flash работает правильно, но проверки :password и :password_confirmation не запускаются. Совпадение пароля, :old_password, на этом тоже работает. Если все поля введены правильно, :flash[:success] срабатывает, но пароль не обновляется. Если используется :on => update,, пароль будет сохранен правильно, но все остальное сломается, потому что :password недоступен для редактирования на любой другой странице.

Кажется, проблема в том, что операторы :on не запускаются правильно для нужных разделов. Я впервые работаю с :on путями, поэтому любая помощь будет принята с благодарностью. Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 22 мая 2011

Мое решение состояло в том, чтобы добавить :if операторов к проверке

validates :password,  :presence     => true,
                      :on           => :create,
                      :confirmation => true,
                      :length       => { :within => 6..20 },
                      :format       => { :with => password_regex }
validates :name,      :length       => { :maximum => 75 }
validates :old_password, :presence  => true,
                          :format    => { :with => password_regex },
                          :if        => :old_password_check?
validates :current_password, :presence  => true,
                         :if        => :login_check?,
                         :format    => { :with => password_regex }
validates :password,  :presence     => true,
                       :confirmation => true,
                       :length       => { :within => 6..20 },
                       :format       => { :with => password_regex },
                       :if           => :old_password_check?

после этого все проверки работали корректно, но пароль не сохранялся правильно, и решение этой проблемы состояло в том, что я написал before_save неправильно, это исправленная версия

before_save do
     if( !self.password.blank? )
        encrypt_password
    end
end

Теперь все работает отлично. Спасибо всем за помощь

0 голосов
/ 13 мая 2011

Я не думаю, что вы можете использовать: таким образом, вы можете использовать только: on с validates_each, validates_with и единственные опции -> : сохранить,: создать,: обновить

Таким образом, вы не можете просто передать случайный метод: при ожидании события, которое сработает, когда это произойдет, оно может сработать только при сохранении, создании и обновлении (по умолчанию - сохранение).

Вы можете делать то, что вы ищете, после или до фильтра. Использование:

before_create: run_before_create_validations

это вызовет run_before_creation_validations перед любым созданием. Здесь вы можете проверить, если это, например, change_password_update, и выполнить некоторые проверки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...