2014-05-25 14 views
7

Sto provando a modificare i campi dal modulo in minuscolo prima che vengano salvati nel database. Questo è il mio codice ma l'output dal database è ancora in maiuscolo perché non funziona il codice?Ruby on Rails: before_save fields in minuscolo

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 {| transazione | transaction.name.downcase! } – bkunzi01

risposta

13

downcase restituisce una copia della stringa, non modifica la stringa stessa. Utilizzare downcase! invece:

def downcase_fields 
    self.name.downcase! 
end 

Vedere documentation per maggiori dettagli.

+0

Come funzionerebbe, se voglio solo ridimensionare un valore del modulo (e non tutti). Siamo spiacenti, nuovo a RoR – fydelio

1

È necessario utilizzare il punto esclamativo dopo il metodo di chiamata downcase, se si desidera salvare anche il risultato dell'operazione sulla variabile. Quindi per voi sarà utilizzabile:

self.name.downcase! 

Non dimenticate che .downcase! La sostituzione funziona solo nella regione ASCII.

2

String#downcase non muta la stringa, restituisce semplicemente una copia modificata di tale stringa. Come altri hanno detto, è possibile utilizzare il metodo downcase!.

def downcase_fields 
    name.downcase! 
end 

Tuttavia, se si voleva rimanere con il metodo di downcase, allora si potrebbe procedere come segue:

def downcase_fields 
    self.name = name.downcase 
end 

Questa riassegna la variabile nome di istanza al risultato della chiamata downcase sul valore originario di nome.

+0

upvote per no self nel primo codice di esempio –

0

Un'altra soluzione è quella di rimuovere il before_save e monkeypatch il metodo initialize

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

allora si può dire una cosa del genere

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

irb(main)> t.name 

=> "bigtransaction 
1

Non stai impostando name a downcase eseguendo self.name.downcase, perché #downcase non modifica la stringa, la restituisce. Si dovrebbe usare il botto downcase metodo

self.name.downcase! 

Tuttavia, c'è un altro modo in cui mi piace farlo:

before_save: { name.downcase! }