2016-04-12 5 views
0

Ich muss Anpassung von Json-Ausgabe pro Konto ermöglichen. Eine Person mag die Standard-JSON-Antwort. Ein anderer möchte vielleicht den gleichen Feed haben, außer dass er das "Name" -Feld namens "account_name" oder so etwas braucht.Ändern von JSON-Feldnamen in Rails-Antworten

So mit einem Standard-Benutzer sie glücklich sein können

@model.to_json(only: [:name, :title, :phone]) 

Ein anderer Benutzer können auf Wunsch ihre json Antwort als

@model.to_json(only: [:name (AS ACCOUNT_NAME) , :title, :phone]) 

Ich habe gefunden, Lösungen zu finden, die die as_json/to_json in der außer Kraft setzen Modell, aber diese scheinen Lösungen zu sein, die alle betreffen. Wie kann ich sie nur pro Zugriff/pro Konto ändern?

+1

aussieht, weil es ist eine extrem seltsame Sache, die man machen möchte. Wie beabsichtigen Sie, die benutzerdefinierten Feldnamen zu speichern? Es liegt an Ihnen, diese benutzerdefinierte Feldzuordnung zu übernehmen und sie auf die Ausgabe von 'as_json' anzuwenden, in welchem ​​Front-End die Anfrage auch bearbeitet wird. – meagar

+0

Feld Aliase würden in einer Vorlage irgendeiner Art gespeichert werden, oder nur ein Remap "set name = new_name" oder etwas Ähnliches. Einige Benutzer Backends erfordern unterschiedliche Eingabe, so dass ich gezwungen bin, zu empfangen –

+0

@ 7urkm3n Das ist nicht Remote-gültige Syntax, aber um fair zu sein, die Proben in der Frage sind auch keine gültige Syntax. – meagar

Antwort

2

Ich denke in Ihrem Fall ist es besser, die Logik auf die view Ebene zu schieben, um den Code sauber zu machen, indem Sie Jbuilder verwenden. so statt Überschreibung to_json Methode können Sie so etwas wie unten tun:

# app/views/users/show.json.jbuilder 

json.model_name do 
    json.title @current_user.title 
    json.phone @current_user.phone 
    if current_user.type_account_name? # need to implement this logic somewhere in your app 
    json.account_name @current_user.name 
    else 
    json.name @current_user.name 
    end 
end 

Update

die Steuerung so etwas wie dieses gibt es noch keine dieser „Rails Weg“ zu tun ist,

class UsersController < ApplicationController 
    def show 
    @user = User.find(params[:id]) 
    end 
end 
+0

Danke, ich kann damit arbeiten. Wie sieht der Controller dafür aus? –

+0

Jbuilder ist ein Teil von rails, wenn Sie also nicht die html-Version, sondern nur die json-Version zurückgeben wollen, können Sie einfach '@ model.to_json (nur: [: name,: title,: phone])' 'entfernen Stelle sicher, dass '@model' zugewiesen ist. dann Schienen werden automatisch die Jbuilder-Vorlage für Sie –

+0

Danke, ich werde dies ausprobieren –