Определить исходное свойство ошибок проверки DataMapper - PullRequest
2 голосов
/ 02 апреля 2012

Я относительно новичок в Ruby, Sinatra и DataMapper, но у меня есть вопрос об ошибках проверки DataMapper.

Я знаю, что вы можете увидеть любые ошибки, которые возникают при попытке сохранить новую строку в базе данныхс DataMapper, выполнив что-то вроде следующего:

user = User.new username: 'bradleygriffith', password: 'not_my_password'
if user.save
  #success!
else
  user.errors.each do |error|
    puts error
  end
end

Что я хотел бы сделать, это определить, на каком свойстве произошла ошибка.Таким образом, например, я мог бы разместить сообщения об ошибках рядом с соответствующими полями в моей регистрационной форме.То есть я хочу знать, что владелец регистрации ввел, скажем, недопустимое имя пользователя до , отображая сообщение об ошибке, чтобы я мог разместить сообщение рядом с полем имени пользователя.

Возможно ли это?

Ответы [ 3 ]

2 голосов
/ 04 апреля 2012

Объект errors является экземпляром DataMapper::Validations::ValidationErrors, который имеет метод on, который будет возвращать массив, содержащий все сообщения об ошибках валидации для переданного вами свойства в качестве параметра или nil, если ошибок нет. (Похоже, что эти документы не соответствуют реализации).

user = User.new username: 'joe', :age => 40

if user.save
  #success!
else
  puts "Username: #{user.username} #{user.errors.on(:username)}"
  puts "Age: #{user.age} #{user.errors.on(:age)}"
end

производит (с соответствующими настройками проверки):

Username: joe ["Username must be between 4 and 20 characters long"]
Age: 40 
1 голос
/ 27 февраля 2014

Я обнаружил, что следующее позволяет получить ошибки, специфичные для поля:

user.errors.keys.each do |key|
  user.errors[key].each do |error|
    puts "#{key} => #{error}"
  end
end
1 голос
/ 02 апреля 2012

Все элементы в атрибуте errors вашего модельного класса являются экземплярами DataMapper::Validation::Violation, у которых есть свойство с именем attribute_name.

Извлечь строка 60 из источник данных datamapper .

#...
def attribute_name
  if @attribute_name
    @attribute_name
  elsif rule
    rule.attribute_name
  end
end
#...

Это означает, что вы можете сделать это

user = User.new username: 'bradleygriffith', password: 'not_my_password'
 if user.save
    #success!
 else
    user.errors.each do |error|
        #print the name of the invalid attribute
        puts error.attribute_name
    end
 end

Причина, по которой это может быть неочевидно, заключается в том, что Violation #to_s метод имеет псевдоним message, и puts будет вызывать #to_s для любого переданного ему объекта, поэтому при вызове puts error он фактически печатает error.message.

...