2014-05-25 12 views
7

Próbuję zmienić pola z formularza na małe litery, zanim zostaną zapisane w bazie danych. To jest mój kod, ale dane wyjściowe z bazy danych wciąż są pisane wielkimi literami, dlaczego nie działa kod?Ruby on Rails: before_save fields to lowercase

class Transaction < ActiveRecord::Base 
    validates :name, presence: true 
    validates :amount, presence: true, numericality: true 
    before_save :downcase_fields 

    def downcase_fields 
     self.name.downcase 
    end 
end 
+1

before_save {| transakcję | transaction.name.downcase! } – bkunzi01

Odpowiedz

13

downcase zwraca kopię ciągu, nie modyfikuje samego ciągu. Użyj downcase! zamiast:

def downcase_fields 
    self.name.downcase! 
end 

Zobacz documentation więcej szczegółów.

+0

Jak by to działało, gdybym tylko chciał obniżyć jedną wartość formularza (i nie wszystkie z nich). Przykro nam, nowy do RoR – fydelio

1

Musisz użyć wykrzyknika po wywołaniu metody downcase, jeśli chcesz zapisać wynik operacji do zmiennej. Więc dla będziecie użytkowa:

self.name.downcase! 

nie należy zapominać, że .downcase! Zastąpienie działa tylko w regionie ASCII.

2

String#downcase nie modyfikuje ciągu znaków, po prostu zwraca zmodyfikowaną kopię tego ciągu. Jak powiedzieli inni, możesz użyć metody downcase!.

def downcase_fields 
    name.downcase! 
end 

Jednakże, jeśli chce pozostać przy metodzie downcase, a następnie można wykonać następujące czynności:

def downcase_fields 
    self.name = name.downcase 
end 

ten przypisuje zmiennej instancji nazwę do wyniku wywołania downcase na pierwotnej wartości Nazwa.

+0

upvote bez własnego ja w pierwszym przykładzie kodu –

0

Innym rozwiązaniem jest usunięcie before_save i monkeypatch the metoda initialize

def initialize(args = {}) 
    args[:name].downcase! if args[:name] 
    super 
end 

Wtedy można powiedzieć coś

irb(main)> t = Transaction.new name: 'BIGTRANSACTION' 

irb(main)> t.name 

=> "bigtransaction 
1

Nie jesteś ustawienie name do downcase uruchamiając self.name.downcase, ponieważ #downcase nie modyfikuje łańcucha, zwraca go. Należy użyć Bang downcase metodę

self.name.downcase! 

Istnieje jednak inny sposób Lubię to zrobić:

before_save: { name.downcase! }