我对我的用户模型进行了有效的验证。但是,由于我们发现用户在长期注册表单中倾向于放弃,我们已将注册表单拆分为多个步骤,以便用户可以放弃任何时间并仍然使用该网站。
我在使用验证进行用户注册的第一步时遇到问题。以下是我的用户模型的相关位:
with_options :if => lambda { |u| u.current_step == "get_started" } do |user|
user.validates :firstname, presence: true, length: { maximum: 50 }
user.validates :surname, presence: true, length: { maximum: 50 }
user.validates :email, presence: true,
format: { with: VALID_EMAIL_REGEX }
user.validates :password_digest, presence: true
user.validates :password, length: { minimum: 6 }
end
此验证工作正常。但是我们现在添加了facebook,因此可以使用facebook登录,我们在facebook_uid
格式中隐藏了字段。所以我想只在这些字段为零时才验证密码。
以下是我尝试修改当前验证的方法:
with_options :if => lambda { |u| u.current_step == "get_started" } do |user|
user.validates :firstname, presence: true, length: { maximum: 50 }
user.validates :surname, presence: true, length: { maximum: 50 }
user.validates :email, presence: true,
format: { with: VALID_EMAIL_REGEX }
with_options :if => lambda { |u| u.facebook_uid.nil? } do |user|
user.validates :password_digest, presence: true
end
with_options :if => lambda { |u| u.user.password_digest_changed? && !u.password.nil? } do |user|
user.validates :password, length: { minimum: 6 }
end
end
或内联(仅限相关密码部分):
user.validates :password_digest, presence: true, if: lambda { |u| u.facebook_uid.nil? }
user.validates :password, length: { minimum: 6 }, if: lambda { |u| u.user.password_digest_changed? && !u.password.nil? }
这些都不适合我,无论我尝试什么,我都会收到这个错误:
undefined method `user' for #<User:0x00000008e924a8>
再次,如果我删除ifs和lambdas作为魅力。还有另一种方法可以实现这个或我目前在代码中出错的东西吗?
答案 0 :(得分:1)
在password
验证lambda中,您正在调用
u.user.password_digest_changed? && !u.password.nil?
即,您正在向user
对象发送u
方法,该对象是您的User
实例。该对象不响应user
。你可能只想要
u.password_digest_changed? && !u.password.nil?