2011-01-16 11 views
2

Das ist in der letzten Woche ein paar Mal für mich aufgekommen und ich habe das Gefühl, dass es einige Best Practices oder Richtlinien geben muss, die mir fehlen. Wir haben eine Rails-App, für die wir eine API erstellen möchten. Wir begannen mit dem Standard, was zu tun:Rails API - Aufrufe in API-Antworten umwandeln

... 
respond_to :json 

def show 
    @post = Post.find(params[:id]) 
    respond_with @post 
end 
... 

So elegant, aber zurück in der realen Welt ... Unsere Ansichten in der Haupt-Website eines gewisse Menge an bedingter Logik für die Ansicht Kopieren/Nachrichten, die die Verbraucher der API will Zugang zu. Es scheint eine vernünftige Anforderung zu sein, dass sie die Kopie in der verbrauchenden (iPhone) Anwendung nicht fest codieren wollen, da sie nur selten veröffentlicht wird und wir in der Lage sein würden, die Nachrichten in unserem Zyklus zu aktualisieren. Hier ist ein Beispiel für eine Ansicht Code:

<% if @post.profanity_detected? %> 
    This post is under review and it'll go live within <%= @post.review_period %> days. Blah blah additional copy... 
<% else %> 
    Your post for <%= @post.title %> looks great... 
<% end %> 

Wie sind Leute mit dieser Art von Anforderung?

1) Ich kann Methoden zu den Modellen hinzufügen, die die entsprechende Nachricht für @ post.profanity_message_text zurückgeben und: diese einschließen, wenn wir die Modelle für die API serialisieren. In einigen Fällen gibt es jedoch eine gute Menge an Kopien, die wirklich nicht so aussehen, als ob sie in das Modell gehören.

2) Ich kann eine show.json.erb-Datei hinzufügen, die die JSON-Antwort mit all den darin enthaltenen Nachrichten aufbaut, aber das scheint, als würde es am Ende eine gute Menge Code duplizieren und fühlt sich relativ langweilig an.

Hat jemand ein Muster gefunden, mit dem sie wirklich glücklich sind?

Danke für die Vorschläge!

Antwort

1

Wie wäre es mit dem Speichern der Nachrichten an config/locale/en.yml?

en: 
    post: 
    accepted: "Your post for %{title} looks great..." 
    reviewed: "This post is under review and it'll go live within %{review_period} days." 

Verwendung mit interpolations:

I18n.t "post.accepted", :title => @post.title 
I18n.t "post.reviewed", :review_period => @post.review_period 
+0

Ja, das ist ziemlich gut. Es spielt gut mit entweder Taktik des Hinzufügens von Methoden auf dem Modell oder Erstellen einer show.json.erb. Sie können auch as_json im Modell überschreiben, um i18n-Schlüssel zu akzeptieren, wie zum Beispiel: as_json (: methods => [: blah],: translation_keys => ['post.notice', 'post.terms_of_use']). Vielen Dank! – njorden

Verwandte Themen