Jus*_*tin 4 passwords ruby-on-rails pinterest
我将首先告诉您我希望如何设置我的设置页面。
我希望用户能够在不需要密码的情况下更改他们的设置,这就是现在将其设置为用户模型的方式
validates :password, presence: true, length: { minimum: 6 }, :on => :create
validates :password_confirmation, presence: true, :on => :update, :unless => lambda{ |user| user.password.blank? }
Run Code Online (Sandbox Code Playgroud)
这使得用户可以在不需要密码的情况下更改他们的所有设置(我知道有些人可能对此不屑一顾)。但我希望用户能够像这样在页面上更改他们的密码......用户点击更改密码,弹出一个模式,用户必须提供他们当前的密码,然后是新密码和新密码的确认。(我知道怎么做模态,我只想知道怎么重置密码)。
这有意义吗??我相信 Pinterest 的做法是一个很好的例子(尽管我认为他们使用的是 Python)
我的建议是使用表单对象:
应用程序/表单/change_password_form.rb
class ChangePasswordForm
extend ActiveModel::Naming
include ActiveModel::Conversion
include ActiveModel::Validations
# Add all validations you need
validates_presence_of :old_password, :password, :password_confirmation
validates_confirmation_of :password
validate :verify_old_password
attr_accessor :old_password, :password, :password_confirmation
def initialize(user)
@user = user
end
def submit(params)
self.old_password = params[:old_pasword]
self.password = params[:password]
self.password_confirmation = params[:password_confirmation]
if valid?
@user.password = password
@user.password_confirmation = password_confirmation
@user.save!
true
else
false
end
end
def verify_old_password
self.errors << "Not valid" if @user.password != password
end
# This method is required
def persisted?
false
end
end
Run Code Online (Sandbox Code Playgroud)
在控制器中初始化表单对象@pass_form = ChangePasswordForm.new(current_user)并在您的模式中使用该对象:form_for @pass_form...并添加old_password,password和password_confirmation字段。
最后,例如,在更新操作中:
@pass_form = ChangePasswordForm.new(current_user)
if @pass_form.submit(params[:change_password_form])
redirect_to some_path
else
render 'new'
end
Run Code Online (Sandbox Code Playgroud)
我还没有测试过这段代码,但你明白了。看看这个Railscasts。