3

言語のモデルがあり、すべての言語をjsonとして取得したいのですが、jsonの出力は次のようになります。

[{"language":{"created_at":null、 "id":1、 "language": "English"、 "updated_at":null}}、{"language":{"created_at":null、 "id" :2、 "language": "Swedish"、 "updated_at":null}}、{"language":{"created_at":null、 "id":3、 "language": "German"、 "updated_at":null }}、{"language":{"created_at":null、 "id":4、 "language": "French"、 "updated_at":null}}、{"language":{"created_at":null、 " id ":5、" language ":" spanish "、" updated_at ":null}}、{" language ":{" created_at ":null、" id ":6、" language ":" dutch "、" updated_at " :null}}、{"言語":{"created_at ":" 2012-12-03T05:01:18Z "、" id ":7、" language ":"タミル語 "、" updated_at ":" 2012-12-03T05:01:18Z "}}]

でもこれを作りたい

{"language":[{"created_at":null、 "id":1、 "language": "English"、 "updated_at":null}、{"created_at":null、 "id":2、 "language" :"Swedish"、 "updated_at":null}、{"created_at":null、 "id":3、 "language": "German"、 "updated_at":null}、{"created_at":null、 "id" :4、 "language": "French"、 "updated_at":null}、{"created_at":null、 "id":5、 "language": "spanish"、 "updated_at":null}、{"created_at" :null、 "id":6、 "language": "dutch"、 "updated_at":null}、{"created_at":null、 "id":7、 "language": "Tamil"、 "updated_at":null }]}

アップデート

def index
 @languages = Language.all
 respond_to do |format|
   format.json { render json: @languages}
 end
end

アップデート2

    class Language < ActiveRecord::Base
        ActiveRecord::Base.include_root_in_json = false
        has_and_belongs_to_many :users 
    end
4

5 に答える 5

15

私はこれがうまくいくと信じています:

format.json { render json: { "language" => @languages.as_json(:root => false) }.to_json }

@languages配列をルートキーのないJSON形式のハッシュモデルの配列に変換し(を使用as_json)、結果をルートキー「言語」のハッシュにラップし、そのハッシュをJSON形式の文字列に変換します。とto_json。(を使用してルートノードを含めるか含めないかの詳細については、ドキュメントas_jsonを参照してください。)

たとえば、モデルの場合Post

posts = Post.all
#=> [#<Post id: 1, name: "foo", title: "jkl", content: "some content", created_at: "2012-11-22 01:05:46", updated_at: "2012-11-22 01:05:46">]

# convert to array of hashes with no root keys
posts.as_json(root: false)
#=> [{"content"=>"some content", "created_at"=>Thu, 22 Nov 2012 01:05:46 UTC +00:00, "id"=>1, "name"=>"foo", "title"=>"jkl", "updated_at"=>Thu, 22 Nov 2012 01:05:46 UTC +00:00}]

# add root back to collection:
{ "post" => posts.as_json(root: false) }
#=> {"post"=>[{"content"=>"some content", "created_at"=>Thu, 22 Nov 2012 01:05:46 UTC +00:00, "id"=>1, "name"=>"foo", "title"=>"jkl", "updated_at"=>Mon, 03 Dec 2012 09:41:42 UTC +00:00}]}

# convert to JSON-formatted string
{ "post" => posts.as_json(root: false) }.to_json    
#=> "{\"post\":[{\"content\":\"some content\",\"created_at\":\"2012-11-22T01:05:46Z\",\"id\":1,\"name\":\"foo\",\"title\":\"jkl\",\"updated_at\":\"2012-12-03T09:43:37Z\"}]}"
于 2012-12-03T06:31:34.663 に答える
3

カスタマイズするモデルのas_jsonをオーバーライドします

def as_json options={}
    {
      id: id,
      login: login, 
      name: custom.value, #for custom name
     ...
    }
end

==> or

def as_json(options={})
  super(:only => [:id, :login, :name ....])
end

から:ここ

他のリンク:ここ

于 2016-04-04T01:12:55.540 に答える
2

rabl gem(https://github.com/nesquena/rabl)を使用してデータをフォーマットすることをお勧めします。

于 2012-12-03T06:21:12.077 に答える
0

jsonをレンダリングするときにカスタムjson出力を追加する最も簡単な方法は、多くのjsonテンプレートを提供するgemを使用することです-

https://github.com/fabrik42/acts_as_api

于 2012-12-03T07:17:23.670 に答える
0

モデルのメソッドをオーバーライドas_jsonして、関連付けを含めたり、列を非表示にしたりしないのはなぜですか?属性であるカスタムメソッドを呼び出す

  def as_json(options={})
    super(:except => [:created_at,:updated_at],
          :include => { 
            :members => {
                :only => [:role, :account], 
                :include => {
                  :account => {
                    :only => [:name, :subdomain]
                  }
                }
              }
            },
          :methods => [:jwt_token]
    )
  end

これにより、次のように出力されます。

{
  "id": 2,
  "name": "Test Teacher",
  "email": "teacher@testing.io",
  "jwt_token":"eyJhbGciOiJIUzI1NiJ9.eyJpZCI6MiwiZXhwIjoxNTY2NzQ0OTQzfQ.HDGu7JiJEQEEpGo7inuXtOZBVQOfTaFquy8dr-QH5jY",

  "members": [{
        "role": "instructor",
        "account": {
            "name": "Testing",
            "subdomain": "test"
         }
  }],
}
于 2019-06-26T14:57:30.270 に答える