1

我正在尝试向我的用户模型添加验证:

class User < ActiveRecord::Base
    validates :first_name, :last_name, :email, :password, presence: true

当验证到位时,它会阻止我“删除”......我通过将is_delete字段设置为1. 我怀疑这与我实际上没有存储:password. 相反,我有对输入的密码加盐和散列的回调,并将它们保存到相应的字段中(散列密码和加盐)。

如果我尝试验证这些,它会阻止创建:

class User < ActiveRecord::Base
    validates :first_name, :last_name, :email, :hashed_pasword, :sal, presence: true

这是有道理的,因为提交表单时它们不存在。

我该如何解决这个问题?

更新 在控制器中...

  def delete_user
    user = User.find( params[:id] )
    # if !user
    #     flash[:error] = "Problem deleting user"
    #     redirect_to controller:'admin', action:'index'
    # end
    if ( user.update( is_deleted: 1) )
        flash[:notice] = "User successfully deleted"
    else
        flash[:error] = "Problem deleting user"
    end
    redirect_to controller:'admin', action:'index'    
  end

更新 我正在尝试使用下面悉尼建议的语法,这是我得到的错误。当我使用这个validates :password, length: { in: 6..20}, on: [:update, :create],然后“删除”一个用户时,我得到这个:

/Users/ME/.rbenv/versions/2.0.0-p247/lib/ruby/gems/2.0.0/gems/activesupport-4.0.0/lib/active_support/callbacks.rb:393: syntax error, unexpected '[', expecting tSTRING_CONTENT or tSTRING_DBEG or tSTRING_DVAR or tSTRING_END ...ue && (validation_context == :[:update, :create]) ... ^ /Users/ESL/.rbenv/versions/2.0.0-p247/lib/ruby/gems/2.0.0/gems/activesupport-4.0.0/lib/active_support/callbacks.rb:402: syntax error, unexpected keyword_end, expecting ')' /Users/ESL/.rbenv/versions/2.0.0-p247/lib/ruby/gems/2.0.0/gems/activesupport-4.0.0/lib/active_support/callbacks.rb:429: syntax error, unexpected keyword_end, expecting ')' /Users/ESL/.rbenv/versions/2.0.0-p247/lib/ruby/gems/2.0.0/gems/activesupport-4.0.0/lib/active_support/callbacks.rb:430: syntax error, unexpected end-of-input, expecting ')'
4

3 回答 3

2

你可以做

验证 :first_name, :last_name, :email, :password, 存在: true, :on => [ :create, :update ]

于 2013-09-11T15:30:19.823 回答
0

由于在创建过程中存在属性(我假设它是虚拟属性) ,因此验证:password有效。加载进去后,就再也无法访问了。所以,什么时候更新,是零。然后验证失败。createpassworduserdelete_useruserpassworduserpassword

解决方案是跳过验证检查。

在您的操作中跳过验证检查delete_user

def delete_user
  user = User.find(params[:id])

  if user.toggle!(:is_deleted)
     # ...
  else
     # ...
  end
end

文档toggle!

保存记录的环绕开关。此方法与其非爆炸版本的不同之处在于它通过属性设置器。保存不受验证检查。如果可以保存记录,则返回 true。

关联

PS:你可能想看看has_secure_password链接

于 2013-09-11T15:44:06.193 回答
0

悉尼建议的问题是软删除根本不是删除。它仍然是一个更新。因此,如果您尝试“删除”,您的验证仍然会失败。

我建议整理您的验证:

class User < ActiveRecord::Base
  validates :first_name, :last_name, :email, :salted_password, :salt, presence: true
  validates :password, presence: true, on: :create

  before :validation, on: :save, :salt_password

  private
    def salt_password
      unless self.password.blank?
        self.salt = ...
        self.salted_password = ...
      end
    end
end
于 2013-10-31T19:30:32.000 回答