0

グレープ (0.14.0) とグレープ エンティティ (0.5.0) を使用して、Rails (4.2.5) アプリ内で XML API を作成しています。Grape::Entity クラス内で明示的なルート要素を指定すると、XML 応答が不要なルート要素にラップされます<hash>。どうすればそれを取り除くことができますか?

サンプルコード

# app/models/partner.rb
class Partner < ActiveRecord::Base
  #  company    :string
  #  name       :string
  #  secret     :string
end

# app/api/partners.rb
class Partners < Grape::API
  version 'v1', using: :path
  prefix :api
  format :xml

  resource :partners do
    get do
      present Partner.all, with: PartnerEntity
    end
  end
end

# app/api/partner_entity.rb
class PartnerEntity < Grape::Entity
  root 'partners', 'partner'
  expose :company
  expose :name
  expose :id
end

# Create a partner 
Partner.create!(name: 'A Name', company: 'A Company', secret: 'A secret')

結果

# GET /api/v1/partners.xml
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<hash>
  <partners type="array">
    <partner>
      <company>A Company</company>
      <name>A Name</name>
      <id type="integer">1</id>
    </partner>
  </partners>
</hash>

PartnerEntity にルートがない結果

# GET /api/v1/partners.xml
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<partner-entities type="array">
  <partner-entity>
    <company>A Company</company>
    <name>A Name</name>
    <id type="integer">2</id>
  </partner-entity>
</partner-entities>

ルート要素に明示的に名前を付ける必要があるため、ルートなしではできません。

4

1 に答える 1

0

このスレ見つけた?XML 形式が間違っていますか?

どの方法でオーバーライドできるかというアイデアが含まれています。カスタムフォーマッターを使用して XML ルートを再定義する

 class API < Grape::API
   content_type :xml, 'application/xml'
   formatter :xml, Proc.new { |object|
     object[object.keys.first].to_xml :root => object.keys.first
 }
于 2016-01-20T16:42:41.157 に答える