rails中验证的问题

时间:2014-01-02 12:38:57

标签: ruby-on-rails ruby validation

我对我的用户模型进行了有效的验证。但是,由于我们发现用户在长期注册表单中倾向于放弃,我们已将注册表单拆分为多个步骤,以便用户可以放弃任何时间并仍然使用该网站。

我在使用验证进行用户注册的第一步时遇到问题。以下是我的用户模型的相关位:

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作为魅力。还有另一种方法可以实现这个或我目前在代码中出错的东西吗?

1 个答案:

答案 0 :(得分:1)

password验证lambda中,您正在调用

u.user.password_digest_changed? && !u.password.nil?

即,您正在向user对象发送u方法,该对象是您的User实例。该对象不响应user。你可能只想要

u.password_digest_changed? && !u.password.nil?