2010-06-01 14 views
8

İçinde dernekler/öznitelikler varsa, onları aramak istediğiniz bir kayıt formum var. Ben de bu sınıfların bazı doğrulama şeyler varRaylar: Genel "X geçersiz" doğrulama hatalarından kurtulmak

class User < ActiveRecord::Base 
    acts_as_authentic 
    belongs_to :user_role, :polymorphic => true 
end 

class Customer < ActiveRecord::Base 
    has_one :user, :as => :user_role, :dependent => :destroy 
    accepts_nested_attributes_for :user, :allow_destroy => true 
    validates_associated :user 
end 

class Employee < ActiveRecord::Base 
    has_one :user, :as => :user_role, :dependent => :destroy 
    accepts_nested_attributes_for :user, :allow_destroy => true 
    validates_associated :user 
end 

:

Benim Hiyerarşi budur. Benim sorunum, boş bir form ile Müşteri (veya Çalışan vb) oluşturmaya çalışırsam, almam gereken tüm doğrulama hatalarını almamın yanı sıra "Kullanıcı geçersiz" ve "Müşteri geçersiz" gibi bazı Jenerik olanları alırsam, orada iç içe Kullanıcı modelinde en az biri geçersiz bir alandır, ekstra mesaj hataların listesine eklenir "X geçersiz" yana

user.login can't be blank 
User is invalid 
customer.whatever is blah blah blah...etc 
customer.some_other_error etc etc 

: hatalar gibi bir şey olsun. Bu, müvekkilim için kafa karıştırıcı oluyor ve bu yüzden hataları kendim yapmak yerine, bunu yapmak için hızlı bir yol olup olmadığını merak ediyorum.

cevap

6

Salil'in cevabı hemen hemen haklıydı ama asla% 100 yapmadı. İşte bunu yapmanın doğru yolu:

def after_validation 
    # Skip errors that won't be useful to the end user 
    filtered_errors = self.errors.reject{ |err| %{ person }.include?(err.first) } 

    # recollect the field names and retitlize them 
    # this was I won't be getting 'user.person.first_name' and instead I'll get 
    # 'First name' 
    filtered_errors.collect{ |err| 
     if err[0] =~ /(.+\.)?(.+)$/ 
     err[0] = $2.titleize 
     end 
     err 
    } 

    # reset the errors collection and repopulate it with the filtered errors. 
    self.errors.clear 
    filtered_errors.each { |err| self.errors.add(*err) } 
    end 
+0

Ayrıca, bir özellik isteğini daha iyi bir çözüm olarak önerdikten sonra bu çalışma: https://rails.lighthouseapp.com/projects/8994-ruby-on-rails/tickets/5632-validates_associated-should-be-allowed -de-değil-bir-oluşturmak-bir-hata # bilet-5632-2 – DJTripleThreat

+0

Ben hata "Sembolün Dize içine örtülü bir dönüşüm yok" – Chemist

+0

@Chemist alıyorum bu rayların eski bir sürümü için çalışıyordu. Sağladığınız kodu, kullanmayı düşündüğünüz sürümle düzgün bir şekilde çalışacak şekilde düzenlemeyi deneyin. – DJTripleThreat

3

Kullanım after_validation yöntem

def after_validation 
    # Skip errors that won't be useful to the end user 
    filtered_errors = self.errors.reject{ |err| %w{ user User }.include?(err.first) } 
    self.errors.clear 
    filtered_errors.each { |err| self.errors.add(*err) } 
    end 

EDITED

Not: - bu Kullanıcı veya kullanıcı var

sizin durumunuzda aşağıdaki listede ekleyin. Alan ile ayrılmış birden fazla assosciation varsa, birden çok ekleyebilirsiniz.

%w{ User user }.include?(err.first) #### This piece of code from the above method has logic which reject the errors which won't be useful to the end user 
+0

Tamam Bu umut verici görünüyor! :) "Not: -" başlığı altında bir dilbilgisi hatası olduğunu düşünüyorum. Beni şaşırtıyor .. "Ekle ... ???" Ayrıca, bu işlevi nereye koymalıyım? her modelde bunu yapan? Bu bir fonksiyon ARB'den geçersiz mi? – DJTripleThreat

+0

dilbilgisi için üzgünüm :). yazdığınız her modelde bu yöntemi yazınız ** validates_associated ** – Salil

+0

Tamam Şimdi size katılıyorum çünkü bu çoğunlukla işe yarar. Ancak bir problem: bunun yerine: ** Login ** çok kısa (en az 3 karakter) ** Şifre ** çok kısa (en az 4 karakter) ** Şifre onayı ** çok kısa (minimum 4 karakter) bu soruyla edilir: ** user.login ** (en az 3 karakter) ** User.password ** (en az 4 karakter) çok kısa çok kısa ** Kullanıcı .password onayı ** çok kısa (en az 4 karakter) Bunu nasıl çözeceğinizi öğrenebilirseniz cevabınızı kabul edeceğim. – DJTripleThreat