2017-06-22 2 views
0

Ich habe eine schnelle name Modellmethode geschrieben, die einen Benutzernamen basierend auf den Feldern zurückgibt, die vorhanden sind.Bedingt hinzufügen von Leerzeichen + Zeichenfolge - Rails 5

class User < ActiveRecord::Base 
    validates :first_name, 
    presence: true, 
    length: { 
     maximum: 64, 
    } 

    validates :last_name, 
    length: { 
     maximum: 64, 
    } 

    def name 
    "#{self.first_name}#{" #{self.last_name}" if self.last_name.present?}" 
    end 
end 

Wenn nur das first_name Feld vorhanden ist, sollte es zurück:

=> "Joe" 

Wenn beide, first_name und last_name Felder vorhanden sind, dann sollte es zurück:

=> "Joe Bloggs" 

der obigen Code Arbeit, aber ich fühle es kann viel aufgeräumt werden.

Ist das eine elegantere Art, dies zu tun?

Dank

Antwort

6

Sie Gebrauch von squish machen kann.

Es entfernt alle Leerzeichen an beiden Enden der Zeichenfolge und ändert auch mehrere Leerzeichen zu eins.

def name 
    "#{self.first_name} #{self.last_name}".squish 
end 

Auch, wie es eine Instanzmethode ist, können Sie self

def name 
    "#{first_name} #{last_name}".squish 
end 

Eg entfernen.

" foo bar ".squish 
#=> "foo bar" 
0

Der übliche Ansatz, den ich nehmen ist:

[ 
    element_1, 
    element_2, 
    ... 
    element_n 
].compact.join(" ") 

Für Datenbereinigungszwecke Sie könnten:

[ 
    element_1, 
    element_2, 
    ... 
    element_n 
].map(&:squish).map(&:presence).compact.join(" ") 

Wenn Sie stattdessen eine Liste dann in Rails zu machen waren Sie könnten versuchen:

[ 
    element_1, 
    element_2, 
    ... 
    element_n 
].map(&:squish).map(&:presence).compact.to_sentence 

... was würde geben Sie eine internationalisierte Zeichenfolge des Formulars:

"a, b, c, and d" 
Verwandte Themen