El validador personalizado lanza RuntimeError: :los atributos no pueden estar en blanco

En mi aplicación Rails, tengo un modelo Me gusta.

### like.rb
### Custom Validator Code:
class UniquenessValidator < ActiveModel::Validator
  def validate(record)
      # Empty   
  end
end

class Like < ActiveRecord::Base
  include ActiveModel::Validations
  validates_with UniquenessValidator

  attr_accessible :user_id

  belongs_to :likeable, polymorphic: true
  belongs_to :user
end

En mi consola Rails trato de hacer Like.all (actualmente mi tabla de Me gusta está vacía)

1.9.2p320 :001 > Like.all
RuntimeError: :attributes cannot be blank
        from /Users/user/.rvm/gems/ruby-1.9.2-p320@test_app/gems/activemodel-3.2.3/lib/active_model/validator.rb:141:in `initialize'
        from /Users/user/.rvm/gems/ruby-1.9.2-p320@test_app/gems/activerecord-3.2.3/lib/active_record/validations/uniqueness.rb:7:in `initialize'
        from /Users/user/.rvm/gems/ruby-1.9.2-p320@test_app/gems/activemodel-3.2.3/lib/active_model/validations/with.rb:84:in `new'
        from /Users/user/.rvm/gems/ruby-1.9.2-p320@test_app/gems/activemodel-3.2.3/lib/active_model/validations/with.rb:84:in `block in validates_with'
        from /Users/user/.rvm/gems/ruby-1.9.2-p320@test_app/gems/activemodel-3.2.3/lib/active_model/validations/with.rb:83:in `each'
        from /Users/user/.rvm/gems/ruby-1.9.2-p320@test_app/gems/activemodel-3.2.3/lib/active_model/validations/with.rb:83:in `validates_with'
        from /Users/user/Programming/WWW/Rails/experiments/test_app/app/models/like.rb:3:in `<class:Like>'
        from /Users/user/Programming/WWW/Rails/experiments/test_app/app/models/like.rb:1:in `<top (required)>'
        from /Users/user/.rvm/gems/ruby-1.9.2-p320@test_app/gems/activesupport-3.2.3/lib/active_support/dependencies.rb:469:in `load'
        from /Users/user/.rvm/gems/ruby-1.9.2-p320@test_app/gems/activesupport-3.2.3/lib/active_support/dependencies.rb:469:in `block in load_file'
        from /Users/user/.rvm/gems/ruby-1.9.2-p320@test_app/gems/activesupport-3.2.3/lib/active_support/dependencies.rb:639:in `new_constants_in'
        from /Users/user/.rvm/gems/ruby-1.9.2-p320@test_app/gems/activesupport-3.2.3/lib/active_support/dependencies.rb:468:in `load_file'
        from /Users/user/.rvm/gems/ruby-1.9.2-p320@test_app/gems/activesupport-3.2.3/lib/active_support/dependencies.rb:353:in `require_or_load'
        from /Users/user/.rvm/gems/ruby-1.9.2-p320@test_app/gems/activesupport-3.2.3/lib/active_support/dependencies.rb:502:in `load_missing_constant'
        from /Users/user/.rvm/gems/ruby-1.9.2-p320@test_app/gems/activesupport-3.2.3/lib/active_support/dependencies.rb:192:in `block in const_missing'
        from /Users/user/.rvm/gems/ruby-1.9.2-p320@test_app/gems/activesupport-3.2.3/lib/active_support/dependencies.rb:190:in `each'
        from /Users/user/.rvm/gems/ruby-1.9.2-p320@test_app/gems/activesupport-3.2.3/lib/active_support/dependencies.rb:190:in `const_missing'
        from (irb):1
        from /Users/user/.rvm/gems/ruby-1.9.2-p320@test_app/gems/railties-3.2.3/lib/rails/commands/console.rb:47:in `start'
        from /Users/user/.rvm/gems/ruby-1.9.2-p320@test_app/gems/railties-3.2.3/lib/rails/commands/console.rb:8:in `start'
        from /Users/user/.rvm/gems/ruby-1.9.2-p320@test_app/gems/railties-3.2.3/lib/rails/commands.rb:41:in `<top (required)>'
        from script/rails:6:in `require'
        from script/rails:6:in `<main>'
1.9.2p320 :002 > 

Que esta pasando aqui ? (por cierto si quito el validates_with UniquenessValidator del Like.rb , no me sale este error)

preguntado el 22 de mayo de 12 a las 20:05

2 Respuestas

Llame a su validador MyUniquenessValidator.

UniquenessValidator ya existe en registro activo. esta cadena from /Users/user/.rvm/gems/ruby-1.9.2-p320@test_app/gems/activerecord-3.2.3/lib/active_record/validations/uniqueness.rb:7:ininitialize'` te lo cuenta.

Tenga cuidado con las clases Ruby y RoR predefinidas (tipos de datos (por ejemplo, "Complejo"), validadores de rieles, etc.)

contestado el 22 de mayo de 12 a las 20:05

Sé que no es su caso, pero recibí este error porque subclasifiqué accidentalmente de EachValidator en lugar de Validator.

Era:

class UserProfileValidator < ActiveModel::EachValidator
  def validate(record)
  end
end

Debería haber sido:

class UserProfileValidator < ActiveModel::Validator
  def validate(record)
  end
end

o:

class UserProfileValidator < ActiveModel::EachValidator
  def def validate_each(record, attribute, value)
  end
end

respondido 13 mar '18, 11:03

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.