1

私はテーブルレスモデルを持っています(#219 railscastに示されているように):

class MyModel
  include ActiveModel::Conversion
  extend ActiveModel::Naming

  attr_accessor :attr1, :attr2, :attr3, :attr4

  private
    def initialize(attr1 = nil)
      self.attr1 = attr1
    end

    def persisted?
      false
    end
end

次に、コントローラーでJSONをレンダリングしようとしています。

@my_model = MyModel.new
render json: @my_model.to_json(only: [:attr1, :attr2])

ただし、モデルのすべての属性を使用してJSONをレンダリングします。

追加しようとしました

include ActiveModel::Serialization

ただし、レンダリングされたJSONは変更されませんでした。

テーブルレスモデルの必要な属性のみを使用してJSONをレンダリングするにはどうすればよいですか?

Rails3.2.3を使用しています

アップデート

みんなありがとう。あなたはほとんど大丈夫のようです。私はあなたのソリューションを組み合わせてこれを手に入れました:

モデル:

include ActiveModel::Serialization

...

def to_hash
  {
    attr1: self.attr1,
    attr2: self.attr2,
    ...
  }
end

コントローラ:

render json: @my_model.to_hash.to_json(only: [:attr1, :attr2])

誰の答えが受け入れられるのか本当にわかりません。

アップデート2

突然、新しい奇妙さが現れました。属性の1つは、ハッシュの配列です。こんな感じでした:

attr1: [[{name: "name", image: "image"}, {name: "name", image: "image"}],
        [{name: "name", image: "image"}, {name: "name", image: "image"}]]

しかし、今ではすべてのコンテンツが失われ、次のようになります。

attr1: [[{}, {}], [{}, {}]]

多分誰かがそれを修正する方法を知っていますか?

アップデート3 :)

エレズ・ラビの答えが役に立ちました。問題を解決するslice代わりに使用する。to_jsonしたがって、最終的な解決策は次のとおりです。

render json: @my_model.to_hash.slice(:attr1, :attr2)
4

3 に答える 3

1

私はそれが簡単ではないことを知っていますが、どうですか?

render :json => @my_model.attributes.slice(:attr1, :attr2)

また、属性メソッドを次のように定義する必要があります。

def attributes
   {:attr1 => self.attr1.....}
end

コメントベンダーをありがとう。

于 2012-07-07T11:28:37.010 に答える
0

Object :: as_jsonが内部で呼び出しているため(これを見てください:http://apidock.com/rails/Object/as_json 、:onlyや:exceptのようなオプションがないため、メソッドto_hashをオーバーライドできます。あなたのクラス、例えば:

def to_hash
  {:attr1 => self.attr1, :attr2 => self.attr2}
end

そしてto_jsonはあなたが望むことを正確に行います。

確かに、別のオプションはメソッドto_jsonをオーバーライドすることです...

于 2012-07-07T11:25:10.587 に答える
0

ドキュメントが示唆しているように、最初のアプローチ(AMシリアル化モジュールを含む)をErezのものと組み合わせることができます。

class MyModel
    include ActiveModel::Serialization::JSON
    ....
    def attributes
       {:attr1 => self.attr1.....}
    end
    ...
end
于 2012-07-07T12:19:13.037 に答える