我正在尝试为我的用户模型添加验证:
class User < ActiveRecord::Base
validates :first_name, :last_name, :email, :password, presence: true
验证到位后,它会阻止我“删除”...我通过将is_delete
字段设置为1
来软删除用户。我怀疑这与我实际上并不存储:password
这一事实有关。相反,我有回调函数,用盐和哈希输入的密码并将它们保存到相应的字段中(hashed_password&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 ')'
答案 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。
PS:
您可能需要查看has_secure_password
(link)
答案 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