Ruby on rails Rails,在带有选项块don';行不通

Ruby on rails Rails,在带有选项块don';行不通,ruby-on-rails,validation,Ruby On Rails,Validation,我有一个旧的Rails 2应用程序,其中我有一个用户模型,可以处理来自web和移动应用程序的用户配置文件。我希望为web和移动用户提供两组独立的验证。我使用Desive进行身份验证 为了识别用户是否与web或mobile相关,在保存/更新记录之前,我在控制器端设置了一个名为validation_for_mobile的属性访问器 似乎有些验证,特别是“validates_length_of:password”,即使它们位于带有不应计算的_选项的块中,也会执行 在用户模型中,我有以下代码: # WE

我有一个旧的Rails 2应用程序,其中我有一个用户模型,可以处理来自web和移动应用程序的用户配置文件。我希望为web和移动用户提供两组独立的验证。我使用Desive进行身份验证

为了识别用户是否与web或mobile相关,在保存/更新记录之前,我在控制器端设置了一个名为validation_for_mobile的属性访问器

似乎有些验证,特别是“validates_length_of:password”,即使它们位于带有不应计算的_选项的块中,也会执行

在用户模型中,我有以下代码:

# WEB VALIDATIONS
with_options :if => "self.validation_for_mobile == false && !self.remote_sync" do |vm1|
    vm1.validates_date :birthday, :allow_blank => true
    vm1.validates_presence_of :company, :name, :surname, :address, :city, :province, :postal_code, :position, :company_type, :phone, :unless => :is_imported
    vm1.validates_format_of :phone, :with => /\A([0-9]+)\Z/i, :message => 'deve contenere solo numeri', :unless => :is_imported

    vm1.validates_presence_of :vat, :if => "!imported && !self.script_imported && company_type != 'individuale' && !company_type.blank?"
    vm1.validates_presence_of :social_number, :if => "!imported && !self.script_imported && company_type == 'individuale' && !company_type.blank? "
    vm1.validates_presence_of  :remote_id, :if => "!came_from_user && !imported && !script_imported"
    vm1.validates_acceptance_of :privacy_accepted, :privacy_third_part, :accept => true, :allow_nil => false, :unless => :is_imported
    vm1.validates_presence_of :login, :email
    vm1.validates_email_format_of :email, :message => "email non valida"
    vm1.validates_presence_of :remote_sap_code, :remote_as_code, :if => "!came_from_user"
    vm1.validates_uniqueness_of :login, :scope => :branch_id, :case_sensitive => false
    vm1.with_options :if => :password_required? do |v|
      v.validates_presence_of :password
      v.validates_confirmation_of :password
      v.validates_format_of :password, :with => /^(?=(.*\d){1})(?=.*[a-zA-Z])[0-9a-zA-Z]+$/i, :message => 'solo lettere e almeno 1 numero!'
      v.validates_length_of :password, :within => 6..10, :allow_blank => true
    end
  end


# MOBILE VALIDATIONS
with_options :if => "self.validation_for_mobile == true && !self.remote_sync" do |vm2|
  with_options :if => :mobile_validations do |vm2|
    vm2.validates_presence_of :company, :vat, :name, :surname, :phone
    vm2.validates_format_of :phone, :with => /\A([0-9]+)\Z/i, :message => 'deve contenere solo numeri'
    vm2.validates_length_of :vat, :within => 11..15
    vm2.validates_presence_of :login, :email, :branch_id
    vm2.validates_email_format_of :email, :message => "email non valida"
    vm2.validates_uniqueness_of :login, :scope => :branch_id, :case_sensitive => false
    vm2.with_options :if => :password_required? do |v|
      v.validates_presence_of :password
      v.validates_confirmation_of :password
      v.validates_format_of :password, :with => /^(?=(.*\d){1})(?=.*[a-zA-Z])[0-9a-zA-Z]+$/i, :message => 'solo lettere e almeno 1 numero!'
      v.validates_length_of :password, :within => 1..10, :allow_blank => true
    end
  end
每次我尝试从mobile创建新用户时,我希望只评估第二个验证块,其中“validates_length_of:password”是“within=>1..10”

但我收到的错误是密码太短(至少6个字符)。那是第一个街区

你能帮我吗

我还尝试将with_选项的条件移动到方法中,如下所示:

with_options :if => :web_validations
with_options :if => :mobile_validations
with_options :if => :mobile_validations do |vm2|
    vm2.validates_presence_of :company, :vat, :name, :surname, :phone
    vm2.validates_format_of :phone, :with => /\A([0-9]+)\Z/i, :message => 'deve contenere solo numeri'
    vm2.validates_length_of :vat, :within => 11..15
    vm2.validates_presence_of :login, :email, :branch_id
    vm2.validates_email_format_of :email, :message => "email non valida"
    vm2.validates_uniqueness_of :login, :scope => :branch_id, :case_sensitive => false
    vm2.with_options :if => [:password_required?, :mobile_validations] do |v2|
      v2.validates_presence_of :password
      v2.validates_confirmation_of :password
      v2.validates_format_of :password, :with => /^(?=(.*\d){1})(?=.*[a-zA-Z])[0-9a-zA-Z]+$/i, :message => 'solo lettere e almeno 1 numero!'
      v2.validates_length_of :password, :within => 1..10, :allow_blank => true
    end
  end
但一切都没有改变

这是我用来测试它的代码:

@user = User.new
@user.company = "Testuser"
@user.vat = "123456789012"
@user.name = "Fafag"
@user.surname = "Fafag"
@user.phone = "9182624"
@user.email = "utentest9876@test.it"
@user.login = "Utentest63"
@user.branch_id = 2

@user.password = "TEST1"
@user.password_confirmation = "TEST1"
@user.plain_password = "TEST1"

@user.mobile_signup = true
@user.mobile = true
@user.validation_for_mobile = true    # model custom validation
@user.renew_mobile_token!

@user.came_from_user = true
@user.remote_id = 0
@user.confirmed = nil
@user.active = false

if @user.save
  return true
else
  puts @user.errors.full_messages.inspect
end

好的,我解决了这个难题

它似乎与_选项嵌套,块不继承外部条件。因此,我必须在嵌套的with_选项块中指定第一个条件,如下所示:

with_options :if => :web_validations
with_options :if => :mobile_validations
with_options :if => :mobile_validations do |vm2|
    vm2.validates_presence_of :company, :vat, :name, :surname, :phone
    vm2.validates_format_of :phone, :with => /\A([0-9]+)\Z/i, :message => 'deve contenere solo numeri'
    vm2.validates_length_of :vat, :within => 11..15
    vm2.validates_presence_of :login, :email, :branch_id
    vm2.validates_email_format_of :email, :message => "email non valida"
    vm2.validates_uniqueness_of :login, :scope => :branch_id, :case_sensitive => false
    vm2.with_options :if => [:password_required?, :mobile_validations] do |v2|
      v2.validates_presence_of :password
      v2.validates_confirmation_of :password
      v2.validates_format_of :password, :with => /^(?=(.*\d){1})(?=.*[a-zA-Z])[0-9a-zA-Z]+$/i, :message => 'solo lettere e almeno 1 numero!'
      v2.validates_length_of :password, :within => 1..10, :allow_blank => true
    end
  end

好的,我解决了这个难题

它似乎与_选项嵌套,块不继承外部条件。因此,我必须在嵌套的with_选项块中指定第一个条件,如下所示:

with_options :if => :web_validations
with_options :if => :mobile_validations
with_options :if => :mobile_validations do |vm2|
    vm2.validates_presence_of :company, :vat, :name, :surname, :phone
    vm2.validates_format_of :phone, :with => /\A([0-9]+)\Z/i, :message => 'deve contenere solo numeri'
    vm2.validates_length_of :vat, :within => 11..15
    vm2.validates_presence_of :login, :email, :branch_id
    vm2.validates_email_format_of :email, :message => "email non valida"
    vm2.validates_uniqueness_of :login, :scope => :branch_id, :case_sensitive => false
    vm2.with_options :if => [:password_required?, :mobile_validations] do |v2|
      v2.validates_presence_of :password
      v2.validates_confirmation_of :password
      v2.validates_format_of :password, :with => /^(?=(.*\d){1})(?=.*[a-zA-Z])[0-9a-zA-Z]+$/i, :message => 'solo lettere e almeno 1 numero!'
      v2.validates_length_of :password, :within => 1..10, :allow_blank => true
    end
  end


你能试着用proc代替字符串吗?这很奇怪。。我试过“with|options:if=>Proc.new{f|self.validation_for|u mobile==true&&!self.remote_sync}do | vm2 |”,现在它说“未定义的方法` validation_for| u mobile',应该是
with|options if:Proc{f | f | f.validation| u for|mobile…)
。您仍在使用移动设备的
self.validation\u
。您是对的。语法错误,但我仍然收到错误“密码太短(最少6个字符)“。它始终运行第一个验证块,即使变量validation\u for_mobile为true。如果我移除那个块,它就会工作。我不知道该怎么办…你能试着用一个进程而不是字符串吗?真奇怪。。我试过“with|options:if=>Proc.new{f|self.validation_for|u mobile==true&&!self.remote_sync}do | vm2 |”,现在它说“未定义的方法` validation_for| u mobile',应该是
with|options if:Proc{f | f | f.validation| u for|mobile…)
。您仍在使用移动设备的
self.validation\u
。您是对的。语法错误,但我仍然收到错误“密码太短(最少6个字符)“。它始终运行第一个验证块,即使变量validation\u for_mobile为true。如果我移除那个块,它就会工作。我不知道该怎么办…你能试着用一个进程而不是字符串吗?真奇怪。。我试过“with|options:if=>Proc.new{f|self.validation_for|u mobile==true&&!self.remote_sync}do | vm2 |”,现在它说“未定义的方法` validation_for| u mobile',应该是
with|options if:Proc{f | f | f.validation| u for|mobile…)
。您仍在使用移动设备的
self.validation\u
。您是对的。语法错误,但我仍然收到错误“密码太短(最少6个字符)“。它始终运行第一个验证块,即使变量validation\u for_mobile为true。如果我移除那个块,它就会工作。我不知道该怎么办…所以,rails 6.0中的嵌套是冗余的EAH仍然是冗余的所以,rails 6.0中的嵌套是冗余的EAH仍然是冗余的所以,rails 6.0中的嵌套是冗余的EAH仍然是冗余的