6

我试着这样做。不幸的是,我在覆盖更新方面遇到了问题,我不知道如何正确地做到这一点。我在另一个地方这样做的方式是:

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接近密码输入。如何实现预期的行为?

4

3 回答 3

17

我接受@anonymousxxx 的回答并添加以下内容:

如果您使用的是 rails admin,您可以按如下方式覆盖控制器“用户”:

#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

这允许我仅在创建新用户并在不更改其密码的情况下进行更新时验证密码是否存在。

我希望这是有帮助的。

于 2014-03-05T15:19:14.090 回答
12

将此代码添加到您的用户模型中。这将为您解决问题。

# User.rb

private    
def password_required?
  new_record? ? super : false
end  
于 2013-05-27T14:35:47.127 回答
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

资源

于 2013-05-17T13:56:21.620 回答