Я создаю аутентификацию, с нуля, без 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
путями, поэтому любая помощь будет принята с благодарностью. Заранее спасибо.