2017-07-18 1 views
1

Meine Rails-Anwendung liest nur Daten auf seiner Datenbank. Es gibt keine Rettung. Meistens sind alle meine Ansichten ein Formular mit einigen Feldern zum Filtern meiner Suche und einer Tabelle, die den Wert jeder Spalte ausgibt. So etwas wie das:Ändern Sie alle Attribute in Ansichten auf Ruby auf Schienen gedruckt

<table> 
<tr> 
    <th> Col1 </th> 
    <th> Col2 </th> 
    <th> Col3 </th> 
    ... 
</tr> 
<% Model.all.each do |model| %> 
<tr> 
    <td> <%= model.col1 %> </td> 
    <td> <%= model.col2 %> </td> 
    <td> <%= model.col3 %> </td> 
    ... 
</tr> 
<% end %> 

Es gibt über 50 Modelle mit jeweils 10-20 Felder, fast 100 Tabellen. Es ist alles sehr einfach.

Nun fragte mein Kunde mir, dass, wenn eine Zelle leer ist (die Daten null oder ‚‘), er will sie drucken ‚-‘ anstelle der leeren Zelle auf dem Tisch

Zuerst dachte ich über etwas wie dies auf meinem application_helper.rb:

def avoid_empty(object) 
if object == nil or object == "" 
    return "-" 
else 
    return object 
end 
end 

und überall auf meine Ansichten würde ich

<%= model.col1 %> 

zu

ändern, nur
<%= avoid_empty(model.col1) %> 

aber ich habe tatsächlich 2659 Zeilen so. Ich bin mir nicht sicher, ob es der gesündere Ansatz ist.

Kann ich es jedes Mal ändern, wenn ich versuche, irgendeinen Wert von diesen Modellen zu drucken, damit ich diese Methode oder etwas Ähnliches zuerst durchgehen kann, ohne jede einzelne meiner 2659 Zeilen ändern zu müssen?

Antwort

2

Sie können die Macht von Rubys Meta-Programmierung und ActiveSupport::Concern verwenden.

Erstellen Sie ein Modellerweiterungsmodul, um die aller Spalten dynamisch zu überschreiben. Unten Code kann das tun:

Fügen Sie dieses Modul in jedes Modell, um '-' statt leer oder Null zu erhalten. Enthalten Modell können Sie tun:

class MyModel 
    include ModelExtension 
end 
+0

Das scheint genau das zu sein, wonach ich suchte, aber es funktioniert nicht. Ich bin mir nicht sicher, ob es daran liegt, dass ich in einer Oracle-Datenbank bin. Es gibt mir diesen Fehler, wenn self.column_names Aufruf: failed Active :: ConnectionAdapters :: OracleEnhancedConnectionException at/gestao_pessoas/Membros/membros_ativos "DESC gestao_pessoas_tb_membro_ativos"; existiert es? . Wenn ich dein Modul entferne, gibt es ein Array mit den Spaltennamen korrekt zurück. So ist es wahrscheinlich das Modul, das es nervt Ich bin mit Rails 4 und die Edelsteine: ‚Rubin oci8‘ und ‚active-oracle_enhanced-Adapter‘, ‚~> 1.5.6‘ –

+1

@HelioBorges ich getestet habe das in Schienen 3 & PostgreSQL. Benutzte niemals Oracle. Können Sie die Details von "self" innerhalb des "included" Blocks angeben? Einige Details wie der Wert von "self" und "self.class". Informationen zur Fehlerrückverfolgung sind ebenfalls hilfreich. Sie können in GitHub gist Backtrace bereitstellen. –

+1

Versuchen Sie auch, dieses Modul in ein anderes Modell zu integrieren, und prüfen Sie, ob es dort funktioniert. –

1

Sie können monkeypatch .

class NilClass 
    def to_s 
    '-' 
    end 
end 

Jedesmal, wenn man rufen, sagen wir, nil.to_s, wird es '-' drucken. Wenn Sie in der Konsole puts nil eingeben, wird - gedruckt. Versuchen Sie das folgende Beispiel:

class NilClass 
    def to_s 
    '-' 
    end 
end 

foo = nil 
foo.to_s #=> '-' 
puts foo #=> - 

In Ihrem Fall alle Vorkommen von leeren (nil) Attribute Ausgabe - in der Ansicht, wenn sie versuchen zu drucken (und werden davor gewarnt, in anderen Teilen der Anwendung auch).

PS .: #to_s gibt eine Zeichenfolge zurück, die das Instanzobjekt darstellt.

+1

nie NilClass monkeypatch vor allem mit metods aus anderen Klassen. Es ist sehr fehleranfällig und Sie würden nicht einmal über diesen Fehler informiert werden. – Ptr

1

Eine Lösung vielleicht Das Null-Objekt-Muster

Null-Objekt ist ein Objekt mit einem gewissen Standardverhalten, die die gleiche Schnittstelle wie ein anderes Objekt implementiert, die verwendet werden könnten, in ein gegebener Fall. Ok, cool, aber wie können wir es auf das folgende Beispiel anwenden?Beginnen sie mit der Benutzermethode starten:

def user 
    @user ||= User.find_by(email: email) || NullUser.new 
end 

Und jetzt können wir NullUser implementieren:

class NullUser 
    def name 
    "Anonymous user" 
    end 
end 
Verwandte Themen