Rails 4:验证可防止删除

时间:2013-09-11 15:16:45

标签: ruby-on-rails ruby ruby-on-rails-4

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

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

验证到位后,它会阻止我“删除”...我通过将is_delete字段设置为1来软删除用户。我怀疑这与我实际上并不存储:password这一事实有关。相反,我有回调函数,用盐和哈希输入的密码并将它们保存到相应的字段中(hashed_pa​​ssword&amp; salt)。

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

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 ')'

3 个答案:

答案 0 :(得分:2)

你可以做到

验证:first_name,:last_name,:email,:password,presence:true,:on =&gt; [:create,:update]

答案 1 :(得分:0)

:password上的验证适用于create,因为在创建过程中,password属性存在(我认为它是虚拟属性)。在user中加载delete_user后,user无法再访问password。因此,更新user时,password为零。然后验证失败。

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

delete_user操作中跳过验证检查:

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

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

toggle!的文档:

  

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

link

PS: 您可能需要查看has_secure_passwordlink

答案 2 :(得分: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