2017-05-31 2 views
2

Ich habe drei Attribute, die ich auf einer Seite anzeigen möchte: length, height und width.bedingt zurückgegebene Attribute in Ruby

Wenn ein viertes Attribut (variable_dimensions) für das Objekt auf true festgelegt ist (wodurch die Eingabe von Daten für die anderen Attribute ungültig wird), möchte ich eine Zeichenfolge zurückgeben, die "Dimensionsvariable" lautet. Wenn width Null ist, möchte ich length x height zurückgeben. Ich möchte die volle length x height x width andernfalls zurückgeben.

Ich habe dies als ein Helfer versucht.

module ItemsHelper 
    def dimensions_available(length, height, width) 
    if @item.variable_dimensions == true 
     return "Dimensions variable" 
    elseif width.nil? 
     dimensions = length, height 
     return dimensions 
    else 
     dimensions = length, height, width 
     return dimensions 
    end 
    end 
end 

Dies funktioniert, wenn dimensions_variable auf true gesetzt ist. Es macht was ich will mit den Objekten, die variable Dimensionen haben. In den anderen beiden Fällen wird auf die Seite als ein Array gedruckt, das aussieht wie [60.3, 35.4, nil], wenn width Null ist, und andernfalls [39, 45.3, 30.4]. Wie entferne ich das Array-Styling, so dass es wie 10cm x 30cm x 48cm aussieht? Ich habe das vorher mit der String-Interpolation versucht, aber mir wurde gesagt, dass es ein Anti-Pattern ist.

+3

Mit Blick auf Ihre [vorherige Frage] (https://stackoverflow.com/questions/44273038/check-if-variables-are-null-and-if-not-print) ist es klar, dass Sie missverstanden haben, was Tadman versuchte um Ihnen zu sagen. String-Interpolation ist kein Antipattern. Die spezifische Konstruktion '# {x} '' (in der die Zeichenkette nichts anderes enthält als einen einzigen' # {...} 'Interpolationsausdruck) ist ein Antipattern, weil du' x' * mit * nichts interpolierst -es entspricht 'x.to_s'. '" # {x} cm x # {y} cm x # {z} cm "' ist * kein * Antipattern. –

Antwort

3

Mit compact, könnten Sie jede nil Dimension entfernen:

module ItemsHelper 
    def dimensions_available(length, height, width) 
    if @item.variable_dimensions 
     "Dimensions variable" 
    else 
     [length, height, width].compact.map do |dim| 
     "#{dim}cm" 
     end.join(' x ') 
    end 
    end 
end 

Auch gibt es keine Notwendigkeit für return oder == true.

2

Sie so etwas tun könnte:

module ItemsHelper 
    def dimensions_available(length, height, width) 
    if @item.variable_dimensions 
     "Dimensions variable" 
    elsif width.nil? 
     "#{length}cm x #{height}cm" 
    else 
     "#{length}cm x #{height}cm x #{width}cm" 
    end 
    end 
end 
Verwandte Themen