2009-11-26 3 views
0

У меня возникли проблемы с проверкой в ​​моей RoR Модель:ActiveRecord проблема пользовательских проверки

 
def save 
    self.accessed = Time.now.to_s 
    self.modified = accessed 
    validate_username 
    super 
end 
 
def validate_username 
    if User.find(:first, :select => :id, :conditions => ["userid = '#{self.userid}'"]) 
    self.errors.add(:userid, "already exists") 
    end 
end 

Как вы можете видеть, я заменил метод сохранения этой модели с моим собственным, называя validate_username до того Я вызываю родительский метод .save. Моя проблема заключается в том, что, хотя ошибка добавляется, Rails по-прежнему пытается вставить новую строку в базу данных, даже если имя пользователя является дубликатом. Что я здесь делаю неправильно?

PS: Я не использую validate_uniqueness_of из следующего выпуска с чувствительностью к регистру: https://rails.lighthouseapp.com/projects/8994/tickets/2503-validates_uniqueness_of-is-horribly-inefficient-in-mysql

Обновление: Я пытался weppos решение, и он работает, но не совсем, как хотелось бы, чтобы это. Теперь поле становится помеченным как неверное, но только если все остальные поля верны. Я имею в виду, например, если я вводил неверный адрес электронной почты, поле электронной почты помечено как es, а поле userid - нет. Когда я отправляю правильный адрес электронной почты, тогда поля userid будут помечены как неправильные. Надеюсь, вы, ребята, понимаете, что я имею в виду: D

Update2: Данные должны быть проверены таким образом, чтобы не было возможности вставлять дубликаты идентификаторов пользователей в базу данных без учета регистра. Идентификаторы пользователя имеют формат «пользовательский домен», например. "Test-something.net". К сожалению, validates_uniqueness_of :userid не работает, он пытается вставить «test-something.net» в базу данных, хотя уже есть «Test-something.net». validate_username должно было быть моим (быстрым) обходным решением для этой проблемы, но это не сработало. Решение weppos действительно работало, но не совсем так, как я хочу (как объяснялось в моем первом обновлении).

Не понял это еще ... кто-нибудь?

С наилучшими пожеланиями, x3ro

+0

Можете ли вы дать более подробную информацию о том, как данные должны быть проверены? –

ответ

5

Почему вы не используете обратный вызов и не оставляете метод сохранения нетронутым? Также избегайте непосредственной интерполяции значений SQL.

class ... < ActiveRecord::Base 

    before_save :set_defaults 
    before_create :validate_username 

    protected 

    def set_defaults 
    self.accessed = Time.now.to_s 
    self.modified = accessed 
    end 

    def validate_username 
    errors.add(:userid, "already exists") if User.exists?(:userid => self.userid) 
    errors.empty? 
    end 

end 
+0

before_create вместо before_save. В противном случае validate_username будет сбой при всех сохранениях. В противном случае отличный ответ. – EmFi

+0

Хорошая точка EmFi! –

0

Как насчет вызова супер, только если validate_username возвращает истину или что-то подобное?

 
def save 
    self.accessed = Time.now.to_s 
    self.modified = accessed 
    super if validate_username 
end 
 
def validate_username 
    if User.find(:first, :select => :id, :conditions => ["userid = '#{self.userid}'"]) 
    self.errors.add(:userid, "already exists") 
    return false 
    end 
end 

... Я думаю, что вы могли бы также удалить совершенно супер вызов. Не уверен, но вы можете проверить это.

Смежные вопросы