1

我有一个用户模型,身份验证由 has_secure_password 提供。我想为密码编辑实现一个单独的视图。

是否有任何体面的教程或学习资源,我可以从中获得更多关于如何最好地实现这一目标的信息?

我的简化模型:

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

  before_save :create_remember_token

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

我想确保密码验证仅在用户编辑 change_password 页面时运行,并且有一个单独的页面用于编辑密码。

我想我需要新的控制器动作,比如edit_passwordand update_password。然后我会这样做:validates :password, on: [:create, :update_password]

我有点卡住了,真的很想浏览一些关于这个主题的示例代码或博客文章。

4

2 回答 2

2

如果您只想在以下情况下运行验证

1.creating the new user
2.updating the password

您可以进行条件验证

class User < ActiveRecord::Base
  attr_accessor :update_password

  validates :password, :length => { :within => 6..40 }, :if => new_record? || update_password
  validates :password_confirmation, presence: true, :if => new_record? || update_password
end

在您的控制器中,您需要将 update_password 设置为 true。

class PasswordsController < ActionController::Base

 def edit
   #You will render the password edit view here
 end

 def update
   @user = User.find(params[:id])
   @user.update_password = true
   @user.password = params[:password]
   @user.password_confirmation = params[:password_confirmation]
   if @user.save
      #success redirect here
   else
      render :edit
   end
 end

end

供参考。

validates :password, on: [:create, :update_password]

这里 :create, :update_password 不代表控制器动作,它代表用户对象的各种状态。它包括 :create、:update 和 update_password 是无效状态。

于 2012-05-24T12:40:25.330 回答
1

我认为学习如何做到这一点的最佳方法是查看设计源代码(或任何其他身份验证宝石),例如密码控制器 https://github.com/plataformatec/devise/blob/master/app/controllers /devise/passwords_controller.rb

于 2012-05-24T11:16:47.757 回答