我试着这样做。不幸的是我有覆盖更新的问题,我不知道如何正确地做到这一点。我在另一个地方这样做的方式是:
if params[:user][:password].blank?
params[:user].delete("password")
params[:user].delete("password_confirmation")
end
# ...
user.save!
所以我试图覆盖update
def update
if params[:user][:password].blank?
params[:user].delete("password")
params[:user].delete("password_confirmation")
end
super
end
但它不起作用。我仍然在密码输入附近can't be blank
。如何实现预期的行为?
答案 0 :(得分:17)
我接受@anonymousxxx的回答并添加以下内容:
如果您使用的是rails admin,则可以覆盖控制器“User”,如下所示:
#app/admin/user.rb
controller do
def update
if params[:user][:password].blank? && params[:user][:password_confirmation].blank?
params[:user].delete("password")
params[:user].delete("password_confirmation")
end
super
end
end
您还应注意,如果您具有用户模型验证,请指定何时应用此类验证,例如:
validates :name, :email, presence: true
validates :password, :password_confirmation, presence: true, on: :create
validates :password, confirmation: true
这允许我仅在创建新用户并更新而不更改其密码时验证密码存在。
我希望这有用。
答案 1 :(得分:11)
将此代码添加到您的用户模型中。这将为你解决问题。
# User.rb
private
def password_required?
new_record? ? super : false
end
答案 2 :(得分:0)
这对我有用:
def update
@user = User.find(current_user.id)
params[:user].delete(:current_password)
if @user.update_without_password(params[:user])
redirect_to ....
else
render ....
end
end
或
def update
if params[:user][:password].blank? && params[:user][:password_confirmation].blank?
params[:user].delete(:password)
params[:user].delete(:password_confirmation)
end
super
end