0

Rails 3.2 を使用して、API ベースのモデル (ActiveRecord ではない) に取り組んでいます。to_jsonRailsコントローラーでこのモデルを呼び出せるようにしたいです。一連の ActiveModel ドキュメントを読んだ後でも、1 つのことについてまだ明確ではありません。

次のようなモデルがあるとします。

class MyModel
  attr_accessor :id, :name
  def initialize(data)
    @id = data[:id]
    @name = data[:name]
  end

  def as_json
    {id: @id, name: @name}
  end
end

これは期待どおりに機能するはずですか、それとも含める必要がありますActiveModel::Serializers::JSONか? as_json/to_jsonメソッドが通常定義されている場所と、Rails がさまざまな状況でどのメソッドを自動的に呼び出すかを理解するのに苦労しています...

洞察をありがとう!

4

1 に答える 1

5

はい、これは機能しますが、あなたが書いたように引用しません.

を使用してコントローラーでjsonをレンダリングする場合

def action
  render :json => @my_model
end

その後、Rails は自動的to_jsonにオブジェクトを呼び出し、定義している限り、to_jsonこれは期待どおりに機能します。

コントローラが Rails 3 のコンテンツ ネゴシエーション シェナニガンを使用している場合、つまり.

class Controller < ApplicationController
  respond_to :json, :html

  def action
    respond_with(@my_model)
  end

次に、クラスをオーバーライドする必要がありますas_jsonが、メソッドの署名にはオプションのオプションのハッシュが ActiveSupport と互換性がある必要があるため、この場合は必要です

def as_json(options={})
  ...
end

または、クラスにインクルードActiveModel::Serializers::JSONし、クラスが属性attributesとその値のハッシュを返すメソッドをサポートしている場合as_json、無料で取得できますが、メソッドを手動でオーバーライドした場合の結果の構造を制御することはできません.

お役に立てれば。

于 2013-03-05T21:48:44.367 に答える