Ich habe ein Modell, das eine Zeitlänge (Minuten und Sekunden Spalten) als Teil seiner Daten hat. Ich möchte eine Methode hinzufügen, um die Zeit als mm: ss (wie 09:08) zurückgeben. Ich habe eine Methode dafür gemacht und es mit irb getestet. Aber wenn ich versuche, auf den Wert aus meiner Sicht zuzugreifen, sieht es so aus, als ob die Instanzvariablen nicht initialisiert werden und ich bekomme "00:00" für alle Werte. Wenn ich hier und anderswo hinschaue, sieht es so aus, als könnte ich eine Klassenmethode erstellen (indem ich self hinzufüge) und den Wert zur Formatierung übergeben, aber das scheint überflüssig zu sein. Die Modellinstanz sollte bereits die Daten enthalten. Verwendet eine Klassenmethode den Rubin-Weg? Oder mache ich etwas anderes offensichtlich falsch?Kann ich eine Instanzmethode für einen berechneten Wert in einem Schienenmodell verwenden?
class Segment < ApplicationRecord
belongs_to :course
def time
m = pad @min
s = pad @sec
m + ":" + s
end
def pad(x)
x.to_s.rjust(2,"0")
end
end
view:
<%= segment.time %> # returns 00:00
<%= segment.min %>:<%= segment.sec %> # returns correct non-padded values
Ich verwende Rails 5.0.1 und Ruby 2.2.6p386.
Ich denke nicht, dass Instanzvariablen das Problem sind. Ich denke, es ist etwas über die Art und Weise, wie Sie die Saite in 'time' bauen. Probieren Sie die String-Interpolation aus, wie eine Antwort vermuten lässt. –
In Bezug auf Klassenmethoden können Sie ganze Programme schreiben, die alles als Argument übergeben und keinen Instanzstatus speichern. Thid dauert länger, um zu schreiben, aber jede Methode kann eigenständig sein kann helfen, Ihren Code zu entkoppeln. Am besten versuchen Sie beide Ansätze und sehen Sie, welche Sie bevorzugen –