从 2 个不同的控制器对同一模型执行不同的现场验证

gui*_*mhs 4 ruby ruby-on-rails ruby-on-rails-3

我正在尝试生成一个快速注册表单,以便在我的应用程序上使用 Facebook、Twitter 和链接登录。但我确实有用户模型来验证之前注册过程中的某些字段。

我正在尝试扩展基于 Devise 的注册控制器,以便使用相同的数据库从外部登录快速注册。这个问题的制定是因为我正在运行试用,然后我有一个注册表单要求信用卡。

我有这个控制器:

class Users::QuickRegistrationController < Users::RegistrationsController

  self.model_class = Users::RegistrationsController

end
Run Code Online (Sandbox Code Playgroud)

然后我有这个用户模型:

class User < ActiveRecord::Base  
  validates :name, :presence => true
  validates :first_surname, :presence => true
  validates :prefered_language, :presence => true
  validates :dni, :presence => true, :uniqueness => true #, :format => {:with => /(^\d{7,8}[a-zA-Z]$)|(^[a-zA-Z]\d{7}[a-zA-Z]$)/, :unless => "dni.blank?"}
  validates :phone_number, :presence => true, :format => { :with => /^((\d{9})|([+]\d{11}))$/, :unless => "phone_number.blank?"}, :uniqueness => true
  validates :birthdate, :presence => true, :age => {:adult => :over}
  validates :legal_conditions, :acceptance => {:accept => true}
  validates :email, :confirmation => true
  validates :email_confirmation, :presence => true
  validates :password_confirmation, :presence => true, :if => "new_record?"
  validates :country, :presence => true
Run Code Online (Sandbox Code Playgroud)

我可以说类似 validates :first_surname, :presence => false 对于 Users::QuickRegistrationController 和 :first_surname, :presence => true 对于 Users::RegistrationsController 吗?

另外,Ruby上有解决这个问题的解决方案,你能提供任何教程或相关链接吗?

Ale*_*tie 5

正如 23tux 所说,验证是基于模型的。我要做的就是向您的模型添加一个新列:

add_column :products, :quick_registration, :boolean, default => true
Run Code Online (Sandbox Code Playgroud)

然后在您的用户模型中:

class User < ActiveRecord::Base  
  validates :name, :presence => true
  validates :email, :confirmation => true
  validates :email_confirmation, :presence => true


  with_options :unless => :quick_registration? do |u|

    # These only validate during full registration
    u.validates :first_surname, :presence => true
    u.validates :prefered_language, :presence => true
    u.validates :dni, :presence => true, :uniqueness => true #, :format => {:with => /(^\d{7,8}[a-zA-Z]$)|(^[a-zA-Z]\d{7}[a-zA-Z]$)/, :unless => "dni.blank?"}
    u.validates :phone_number, :presence => true, :format => { :with => /^((\d{9})|([+]\d{11}))$/, :unless => "phone_number.blank?"}, :uniqueness => true
    u.validates :birthdate, :presence => true, :age => {:adult => :over}
    u.validates :legal_conditions, :acceptance => {:accept => true}
    u.validates :password_confirmation, :presence => true, :if => "new_record?"
    u.validates :country, :presence => true

  end
end
Run Code Online (Sandbox Code Playgroud)

quick_registration然后在您的控制器中,您可以通过设置为 false来“打开”附加验证:

@user.quick_registration = false
@user.save   # all validations should fire
Run Code Online (Sandbox Code Playgroud)