W jaki sposób uprościć kod w modelu

Witam!
Przed walidacją w modelu wykorzystuje funkcję która potrzebuje jeden argument, zastanawiam się czy da się to jakoś uprościć aby się nie powtarzać

before_validation normalize_number :nip
before_validation normalize_number :bacc

Np tak:

before_validation normalize_number do |k| 
k.nip
k.bacc

end

Czy niestety to nie działa

Może po prostu stworzyć metodę?

before_validation :normalize_nip_and_bacc

...

private

def normalize_nip_and_bacc
  normalize_number :nip
  normalize_number :bacc
end

A w przyszlości pomyśleć o tym żeby wszelkie callbacki przeniesc do klasy która odpowiada za zapis twojego obiektu ( model tą klasą być nie powinien , przynajmniej w bardziej złożonych apkach) i tam je odpowiednio parsować.

Ale na czas małej aplikacji na początku przygody z railsami +1 dla rozwiązania kolegi wyżej ;]

3 Likes

Dzięki!
Wcześniej wykorzystywałem metode do normalizacji każdej z osobna potem stworzyłem klase w której umieściłem normalize_number, no i nie wpadłem na to że można wykorzystać metodę jeszcze raz…

Moglbys tez hardcorowo ‘normalizowac’ w setterach - i wtedy odpada wołanie normalizacji w callbackach:

class Bank < ActiveRecord::Base
  
  attr_reader :number
  
  def number=(number) 
    write_attribute(:number, normalize_number(number))
    #@number = normalize_number(number)
  end

  private

  def normalize_number(number)
    number.to_s.gsub('-', ' ')
  end

end
before_validation normalize_number [:nip, :bacc]

?

To mi się podoba jednak nie działa…
Dzięki za pomysły :smile: