2016-07-12 26 views
0

Ich habe zwei Modelle nämlich post und Kommentar. Jedes Modell hat ein Feld namens created_at mit Datentyp Datum, beim Rendern der JSON-Antwort muss ich das created_at-Feld formatieren, aber es ist für beide Modelle unterschiedlich.Schienen Modell spezifische Datum Formatierung

für das Modell das Format veröffentlichen 12 2016 Mai

für den Kommentar Modellformat sein muss, ist 2016.05.12

es für die Angabe des Formats mit spezifischen Modell alle Optionen ?

Und ich möchte keine zusätzliche Funktion haben, weil ich verwendet habe, um Datum an verschiedenen Orten anzuzeigen, wenn ich also eine Funktion schreibe, muss ich es an allen Orten ändern.

+1

Wäre es nicht sinnvoller, wenn der JSON ISO8601-Formate für Uhrzeit und Datum enthält und der Verbraucher dann entscheiden kann, wie diese angezeigt werden sollen?Es ist im Allgemeinen der beste Ansatz, Formatierungsprobleme an die äußersten Kanten zu schieben. –

+0

@muistooshort Ich möchte nicht, dass der Verbraucher die Kontrolle zu halten. –

Antwort

0

Sie können Funktionen direkt in Ihren Modellen erstellen, um die Datumszeit von created_at nach Belieben zurückzugeben.

class Post < ActiveRecord::Base 
    def get_date 
    created_at.strftime("%b %-d %y") 
    end 
end 

und

class Comment < ActiveRecord::Base 
    def get_date 
    created_at.strftime("%m-%d-%Y") 
    end 
end 

dann setzen Sie einfach die folgenden in Ihrer Ansicht:

<%= @comment.get_date %> 

Weitere Möglichkeiten, um Ihre Datetime zu formatieren Sie die strftime Methode, check this out: http://apidock.com/ruby/DateTime/strftime

UPDATE (Frage jetzt re flects die Notwendigkeit JSON)

class Post < ActiveRecord::Base 
    def as_json(options) 
    super(options).merge({ 
     :created_at => self.created_at.strftime("%b %-d %y") 
    }) 
    end 
end 

und

class Comment < ActiveRecord::Base 
    def as_json(options) 
    super(options).merge({ 
     :created_at => self.created_at.strftime("%m-%d-%Y") 
    }) 
    end 
end 
+0

Ich möchte keine zusätzliche Funktion haben, weil ich früher das Datum an verschiedenen Stellen angezeigt habe. Wenn ich also eine Funktion schreibe, muss ich sie an allen Stellen ändern. –

+0

Die letzten beiden Codebausteine ​​(nach dem Update) betreffen nur die JSON-Objekte, wenn Sie die Methode 'as_json' verwenden. Sie müssen keinen der anderen dafür benutzen, um zu arbeiten. – Okomikeruko

+0

Das funktioniert gut, wenn ich as_json verwende, aber was ist, wenn ich as_json nicht verwende. –

0

Sie sollten I18n verwenden, die automatisch mit Schienen versehen ist.

Um das Format einzustellen, gehen Sie zu config/locales/<current_locale>.yml (current_locale Standardwerte en).

en: 
    time: 
    formats: 
     default: "%b %-d %y" 
     short: "%m-%d-%Y" 

Ihrer Ansicht nach kann man dann wie folgt verwenden:

<p><%= I18n.l @post.created_at, format: :default %></p> 
<p><%= I18n.l @comment.created_at, format: :short %></p> 

Oder wenn Sie für die schmutzigen, inoffizielle Weise möchten, können Sie Ihre Getter in den Modellen überschreiben:

class Post < ActiveRecord::Base 
    def created_at 
    I18n.l(super)  
    end 
end 

HINWEIS das ist wirklich eklig, weil Sie den Getter von created_at überschreiben. Da es sich um ein Datum handelt, können Sie nicht mehr das echte Date/Time-Objekt verwenden. Stattdessen erhalten Sie jedes Mal einen String.

Bitte benutzen Sie I18n! Es ist eine gute Möglichkeit, die Daten in Schienen zu formatieren.

+0

Es ist eine der Art zu formatieren, aber gibt es irgendwelche Optionen, um das Standardformat für das Attribut in Modell das Modell –

+0

@BalaKarthik siehe bearbeiten. – siegy22