gpt4 book ai didi

ruby-on-rails - 更新时的 attr_accessor 和密码验证

转载 作者:行者123 更新时间:2023-12-04 06:20:02 25 4
gpt4 key购买 nike

我的用户模型中有此代码:

class User < ActiveRecord::Base
attr_accessible :email, :password, :password_confirmation
attr_accessor :password

before_save :encrypt_password

validates :email, :presence => true,
:uniqueness => { :case_sensitive => false },
:format => { :with => /\A[^@]+@[^@]+\z/ },
:length => 7..128
validates :password, :presence => true,
:confirmation => true,
:length => 6..128

private
def encrypt_password
return unless password
self.encrypted_password = BCrypt::Password.create(password)
end
end

现在在我的 Controller 中,当我更新一些用户字段时
@user.update_attributes(params[:user])

密码字段总是被验证,即使它没有在 params 哈希中设置。我认为这是因为 attr_accesor :password 总是在 update_attributes 上设置 password = ""。

现在我可以简单地跳过密码验证,如果它是一个空字符串:
validates :password, :presence => true,
:confirmation => true,
:length => 6..128,
:if => "password.present?"

但这不起作用,因为它允许用户设置空密码。

在我想要更改的字段上使用 update_attribute 不是解决方案,因为我需要对该属性进行验证。
如果我传入确切的参数
@user.update_attributes(params[:user][:fieldname])

它不能解决问题,因为它还会触发密码验证。

有没有办法防止 attr_accesor :password 在更新时总是设置 password = ""?

最佳答案

新答案

这对我有用:

validates :password, :presence     => true,
:confirmation => true,
:length => { :minimum => 6 },
:if => :password # only validate if password changed!

如果我没记错的话,我也花了一些时间才能做到这一点(大量的反复试验)。我从来没有时间去弄清楚为什么会这样(与 :if => "password.present?" 相反)。

旧答案 - 对您的目的不是很有用(见评论)
我通过使用完全不同的密码更新操作(user#update_password)来解决这个问题。现在只验证密码字段就足够了
:on => [:create, :update_password]

(并且也只能使其可用于这些操作)。

这里有更多细节:

在您的 route :
resources :users do
member do
GET :edit_password # for the user#edit_password action
PUT :update_password # for the user#update_passwor action
end
end

在您的用户 Controller 中:
def edit_password
# could be same content as #edit action, e.g.
@user = User.find(params[:id])
end
def update_password
# code to update password (and only password) here
end

在您的 edit_password View 中,您现在有一个仅用于更新密码的表单,与您在编辑 View 中的表单非常相似,但使用 :method => :put 和 :url => edit_password_user_path(@user)

关于ruby-on-rails - 更新时的 attr_accessor 和密码验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8170422/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com