2

ロケット パンツを使用して JSON API をレンダリングしています。

モデルで as_json をオーバーライドして JSON をレンダリングする方法を変更しようとしていますが、どういうわけか、ロケット パンツの応答で何も変更されていないようです。

私のコントローラーで:

class Api::V1::ProjectsController < RocketPants::Base
  ...
  def show
    expose Project.find(params[:id])
  end
  ...
end

そして私のモデルでは:

class Project < ActiveRecord::Base
  ...
  def as_json(options = {})
    {"this" => "is not working!"}
  end
  ...
end

私は何が欠けていますか?

4

3 に答える 3

8

さらに、公開ブロックに送信できるオプションの最初のセットがあります。ソースによっては、オプションを serializable_hash メソッドに渡すことができます。例えば:

expose user, only: [:name, :email]

これにより、名前と電子メールでオブジェクトの serializable_hash が呼び出されます。

この一連のオプションで熱心な読み込みを指定することもできます。例えば:

expose uploads, :include => { :user => { :only => :username } }.

これにより、アップロードが公開され、ユーザーとの belongs_to 関連付けが熱心に読み込まれます。

ソース: https://github.com/filtersquad/rocket_pants/issues/20#issuecomment-6347550

于 2013-05-23T15:18:23.160 に答える
5

私はそれを行う方法を考え出しました。ロケットパンツの働き方は、serializable_hashメソッドを見ることです。オーバーライドすると、応答が変わります。

編集:

私が得た解決策:

いくつかの属性を追加する必要があるモデルでは、単に属性メソッドをオーバーライドします。

 # Overriding this method is required for the attribute to appear in the API
  def attributes
    info = {} # add any logic that fits you

    super.merge info
  end

API を公開する必要があるコントローラーで、新しい Model クラスを作成し (これは、異なる API バージョンを保持するためにのみ必要です)、serializable_hash メソッドをオーバーライドしました。

  class Location < ::Location 
    def serializable_hash(options = {})
      super only: [:id, :lat, :long],
            include: [user: {only: ...your attributes here...}]
    end
  end
于 2012-07-30T16:06:18.037 に答える