2016-05-04 33 views
0

我想將下面的邏輯移到其他地方,以便我可以在我的控制器和rake任務中使用它。如何在rake任務中呈現json

我的控制器動作看起來是這樣的:

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 

基本上一點是,我必須遍歷關聯,因此JSON有其中的所有數據。

我該如何將這個邏輯移到別的地方,然後我可以在我的控制器動作中調用它,也可以在rake任務中調用它。

+0

一個想法是;你創建一個'無表模型'(它是一個普通的Ruby類),開啓一個API來完成這項工作。然後你可以從任何地方調用它 – illusionist

+0

你可以覆蓋[as_json](http://apidock.com/rails/Hash/as_json)方法到用戶模型中,然後從控制器以及從rake任務中調用它。 –

回答

1

將代碼提取到presenter或使用ActiveModel::Serializers,以便控制器和Rake任務調用此新類。

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

渲染方法不是在幕後做一些工作嗎?不知道我可以重構它。 – Blankman

+0

我不確定。我通過傳遞一個Hash來獲得成功,並將其轉換爲JSON。 –