Ruby on rails (设计)更新时需要密码,即使密码为空
我的用户模型无法保存,因为密码和密码确认不能为空。这种情况发生在: 在编辑用户注册时更新用户,并将密码和密码确认留空。这是我第一次注意到的地方 在控制台上,加载对象并调用save后立即执行。 如果需要密码,Desive将验证密码的存在Ruby on rails (设计)更新时需要密码,即使密码为空,ruby-on-rails,ruby,devise,Ruby On Rails,Ruby,Devise,我的用户模型无法保存,因为密码和密码确认不能为空。这种情况发生在: 在编辑用户注册时更新用户,并将密码和密码确认留空。这是我第一次注意到的地方 在控制台上,加载对象并调用save后立即执行。 如果需要密码,Desive将验证密码的存在 validates_presence_of :password, :if => :password_required? def password_required? !persisted? || !password.nil? ||
validates_presence_of :password, :if => :password_required?
def password_required?
!persisted? || !password.nil? || !password_confirmation.nil?
end
这是我的rails控制台输出:
Loading development environment (Rails 3.2.11)
1.9.3p374 :001 > u = User.last
User Load (1.0ms) SELECT "users".* FROM "users" ORDER BY "users"."id" DESC LIMIT 1
=> #<User id: 9, name: "Name", email: "name@example.com", encrypted_password: "$2a$10$oCL2K0nEa8LxaMGuC1oyNOuwIHk8l/IOW.AylGcWTYj3...", reset_password_token: nil, reset_password_sent_at: nil, remember_created_at: nil, sign_in_count: 2, current_sign_in_at: "2013-02-06 20:56:14", last_sign_in_at: "2013-02-06 20:52:01", current_sign_in_ip: "127.0.0.1", last_sign_in_ip: "127.0.0.1", confirmation_token: nil, confirmed_at: "2013-02-07 22:04:01", confirmation_sent_at: "2013-02-07 22:03:25", unconfirmed_email: nil, authentication_token: nil, created_at: "2013-02-06 20:52:00", updated_at: "2013-02-07 22:04:31">
1.9.3p374 :002 > u.save
(0.2ms) BEGIN
(0.2ms) ROLLBACK
=> false
1.9.3p374 :003 > u.errors
=> #<ActiveModel::Errors:0x007f832c04f090 @base=#<User id: 9, name: "Name", email: "name@example.com", encrypted_password: "$2a$10$oCL2K0nEa8LxaMGuC1oyNOuwIHk8l/IOW.AylGcWTYj3...", reset_password_token: nil, reset_password_sent_at: nil, remember_created_at: nil, sign_in_count: 2, current_sign_in_at: "2013-02-06 20:56:14", last_sign_in_at: "2013-02-06 20:52:01", current_sign_in_ip: "127.0.0.1", last_sign_in_ip: "127.0.0.1", confirmation_token: nil, confirmed_at: "2013-02-07 22:04:01", confirmation_sent_at: "2013-02-07 22:03:25", unconfirmed_email: nil, authentication_token: nil, created_at: "2013-02-06 20:52:00", updated_at: "2013-02-07 22:04:31">, @messages={:password=>["can't be blank"], :password_confirmation=>["can't be blank"]}>
1.9.3p374 :004 > !u.persisted? || !u.password.nil? || !u.password_confirmation.nil?
=> false
谢谢你的帮助 在更新方法中执行此操作
user = User.find_by_id(params[:id])
unless user.blank?
if user.update_attributes(params[:user])
flash[:notice] = "User updated successfully."
redirect_to "somwhere"
else
render :action => 'edit'
end
else
render :action => 'edit'
end
如果不想更新旧密码,请在更新前添加以下行,以便新代码为:
user = User.find_by_id(params[:id])
unless user.blank?
params[:user].delete(:password) if params[:user][:password].blank?
params[:user].delete(:password_confirmation) if params[:user][:password_confirmation].blank?
if user.update_attributes(params[:user])
flash[:notice] = "User updated successfully."
redirect_to "somwhere"
else
render :action => 'edit'
end
else
render :action => 'edit'
end
在user.rb模型中编写如下内容
devise :database_authenticatable, :registerable,
:recoverable, :rememberable, :trackable, :validatable, :locakable
在更新方法中执行此操作
user = User.find_by_id(params[:id])
unless user.blank?
if user.update_attributes(params[:user])
flash[:notice] = "User updated successfully."
redirect_to "somwhere"
else
render :action => 'edit'
end
else
render :action => 'edit'
end
如果不想更新旧密码,请在更新前添加以下行,以便新代码为:
user = User.find_by_id(params[:id])
unless user.blank?
params[:user].delete(:password) if params[:user][:password].blank?
params[:user].delete(:password_confirmation) if params[:user][:password_confirmation].blank?
if user.update_attributes(params[:user])
flash[:notice] = "User updated successfully."
redirect_to "somwhere"
else
render :action => 'edit'
end
else
render :action => 'edit'
end
在user.rb模型中编写如下内容
devise :database_authenticatable, :registerable,
:recoverable, :rememberable, :trackable, :validatable, :locakable
多亏了@rainkinz,我又回到了用户模型的基础上,仔细看了看。我发现我正在导入的模块正在添加一个额外的
validates :email, :password, :password_confirmation, presence: true
通过在控制台中运行,我可以看到这一点:
User.validators
...
#<ActiveModel::Validations::PresenceValidator:0x007fb80fbcd260
@attributes=[:email, :password, :password_confirmation],
@options={}>,
...
移除这些解决了问题。谢谢你的帮助 多亏了@rainkinz,我回到了基本的用户模型,并仔细看了看。我发现我正在导入的模块正在添加一个额外的
validates :email, :password, :password_confirmation, presence: true
通过在控制台中运行,我可以看到这一点:
User.validators
...
#<ActiveModel::Validations::PresenceValidator:0x007fb80fbcd260
@attributes=[:email, :password, :password_confirmation],
@options={}>,
...
移除这些解决了问题。谢谢你的帮助 我也遇到过类似的问题,但对我有效的解决方案是,在做了我想做的事情之后,用super再次调用designe的方法。例如:
def password_required?
return false if some_check?
super
end
我也遇到过类似的问题,但对我有效的解决方案是,在做了我想做的事情之后,用super再次调用Desive的方法。例如:
def password_required?
return false if some_check?
super
end
这一点对我很有帮助。你能发布你的整个用户模型吗?这里一定还有别的事。奇怪的是,您得到了:password\u confirmation=>[不能为空]错误。你在什么地方验证过吗?谢谢你的帮助!它必须在别的地方,晚点睡个好觉,你的建议让它变得显而易见。我回答我自己的问题,解释这个问题。再次感谢!你能发布你的整个用户模型吗?这里一定还有别的事。奇怪的是,您得到了:password\u confirmation=>[不能为空]错误。你在什么地方验证过吗?谢谢你的帮助!它必须在别的地方,晚点睡个好觉,你的建议让它变得显而易见。我回答我自己的问题,解释这个问题。再次感谢!没有必要这样做,因为登记是由Deave处理的。在注册控制器上调用“resource.update_with_passwordresource_params”,这是当前密码,而不是密码和密码确认,其中params[:password]。空白?在尝试正常的“更新属性参数,*选项”之前,密码和密码确认都会从参数中删除,这是在模型上发生的,因为我能够单独使用控制台复制问题。此外,与将很快被弃用的按id查找不同,请参见Rails 4,改用findparams[:id]或,更通用的,其中…首先。是的,我的用户模型与此非常相似。没有必要这样做,因为注册是由Desive处理的。在注册控制器上调用“resource.update_with_passwordresource_params”,这是当前密码,而不是密码和密码确认,其中params[:password]。空白?在尝试正常的“更新属性参数,*选项”之前,密码和密码确认都会从参数中删除,这是在模型上发生的,因为我能够单独使用控制台复制问题。此外,与将很快被弃用的按id查找不同,请参见Rails 4,改用findparams[:id]或,更通用的,其中…首先。是的,我的用户模型与此非常相似。太棒了。很高兴你知道了,太棒了。很高兴你明白了。