rob*_*sco 15 validation ruby-on-rails models
我有一个用户模型,通常的属性,如电子邮件和hashed_password等.我想写一个验证,检查是否存在电子邮件地址,但仅限于
1)数据库中没有存储该对象(即这是一个新用户注册)
2)用户正在尝试更新他们的电子邮件地址.
我目前的验证
validates_presence_of :email
validates_presence_of :email_confirmation
validates_confirmation_of :email
Run Code Online (Sandbox Code Playgroud)
显然阻止我更新任何属性.我想过要用
validates_presence_of:email,:if:email_validation_required?
def email_validation_required?
self.email.blank?
end
Run Code Online (Sandbox Code Playgroud)
但是这对情节2没有帮助,因为它会返回true,因为用户在数据库中确实有一个密码电子邮件地址.
我无法弄清楚如何将其限制在上述两种情况中.
有人可以帮忙吗?
Bar*_*ess 22
我认为EmFi正在做点什么.但我不认为validates_presence_of :email应该阻止你.该email应始终存在-如果在表单留空参数不会惹你节省用户的.如果它在表单中输入,即使是更新,它也应该有一个email_confirmation沿途.
尝试一下:
validates_presence_of :email
validates_presence_of :email_confirmation, :if => :email_changed?
validates_confirmation_of :email
Run Code Online (Sandbox Code Playgroud)
Mat*_*ggs 10
你有两个选择.一个是用:on.默认情况下,它们设置为:on => :save,但您可以执行此类操作
validates_presence_of :email, :on => :create
Run Code Online (Sandbox Code Playgroud)
要么
validates_presence_of :email, :on => :update
Run Code Online (Sandbox Code Playgroud)
其他选项是使用:if,然后传入方法名称或proc.所以像
validates_presence_of :email, :if => :should_validate
Run Code Online (Sandbox Code Playgroud)
要么
validates_presence_of :email, :if => Proc.new { |user| user.signup_stage > 2 }
Run Code Online (Sandbox Code Playgroud)
希望有帮助:)
您想在使用ActiveRecord :: Dirty方法的验证上使用:if子句:
validates_presence_of :email, :if => Proc.new { |user| user.email_changed?}
Run Code Online (Sandbox Code Playgroud)
NB仅适用于Rails 2.1或更高版本.
| 归档时间: |
|
| 查看次数: |
13449 次 |
| 最近记录: |