2016-05-04 12 views
0

以下のロジックを別の場所に移動したいので、コントローラーとレーキタスクの両方で使用できます。基本的にはポイントは、私はJSONはその内のすべてのデータを持っているので、関連をトラバースしなければならないということです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 

私のコントローラのアクションは、次のようになります。

このロジックを別の場所に移動するにはどうすればいいですか。コントローラの動作とレイクタスクでこのロジックを呼び出すことができます。

+0

1つのアイデアがあります。この仕事をしているapiを開く 'table-less model'(通常のRubyクラス)を作成します。次に、どこからでも呼び出すことができます – illusionist

+0

[as_json](http://apidock.com/rails/Hash/as_json)メソッドをユーザーモデルに上書きしてから、コントローラとレーキタスクから呼び出すことができます。 –

答えて

1

presenterにコードを抽出するか、コントローラとRakeタスクがこの新しいクラスを呼び出すようにActiveModel::Serializersを使用してください。

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

わかりません。私はハッシュを渡すことで成功し、それをJSONに変換します。 –

関連する問題