2016-05-04 13 views
0

Ich möchte die unten Logik zu woanders verschieben, so dass ich es sowohl in meinem Controller als auch in einer Rake-Aufgabe verwenden kann.Wie man json in einer Rake-Aufgabe rendert

Mein Controller-Aktion sieht ungefähr so ​​aus:

def show 
    @user = User.find(params[:id]) 

    @account = # load account 
    @sales = # load sales 
    .. 

    render :json => { 
    "user": user, 
    "account": @account.map do |a| 
     JSON.parse(a.to_json(include: :addresses)) 
     end, 
     "sales": @sales.map do |s| 
     JSON.parse(s.to_json(include: :products)) 
     end 
    } 
end 

Grundsätzlich ist der Punkt ist, dass ich die Verbände zu durchqueren, um die JSON alle Daten in ihm hat.

Wie kann ich diese Logik woanders verschieben, damit ich sie dann in meiner Controller-Aktion und auch in einer Rake-Task aufrufen kann.

+0

eine Idee ist; Sie erstellen ein 'tabellenloses Modell' [es ist eine normale Ruby-Klasse] und öffnet eine API, die diesen Job erledigt. Dann können Sie es von überall anrufen – illusionist

+0

Sie können [as_json] (http://apidock.com/rails/Hash/as_json) -Methode in Benutzermodell überschreiben, und rufen Sie es dann vom Controller sowie von Rake-Task. –

Antwort

1

Entpacken Sie den Code in presenter oder verwenden Sie ActiveModel::Serializers, damit der Controller und die Rake-Task diese neue Klasse aufrufen.

class UserPresenter 
    def initialize(user, account, sales) 
    @user = user 
    @account = account 
    @sales = sales 
    end 

    def as_json(*) 
    { 
    "user": @user, 
    "account": @account.map do |a| 
     JSON.parse(a.to_json(include: :addresses)) 
     end, # or @account.as_json(include: :addresses)) 
    "sales": @sales.map do |s| 
     JSON.parse(s.to_json(include: :products)) 
     end # or @sales.as_json(include: :products)) 
    } 
    end 
end 

# In the controller 
render json: UserPresenter.new(@user, @account, @sales) 
+0

Ist die Rendermethode nicht im Hintergrund? Nicht sicher, wie ich es umgestalten kann. – Blankman

+0

Ich bin mir nicht sicher. Ich hatte Erfolg, indem ich ihm einen Hash übergab und es in JSON umwandelte. –

Verwandte Themen