Active Model Serializer を使用すると .to_xml が正しく動作しない
概要
MIME 応答を使用して、Rails API で XML 応答をレンダリングしようとしています。 コードは次のようなものです:
|format| を実行するための応答format.xml { レンダリング XML: @records.to_xml、ステータス: :ok } format.json { レンダリング json: @records、ステータス: :ok } end
@records でシリアライザーを使用して、必要なレコードを適切に表示しています。ただし、JSON 形式でのみ機能し、XML 形式では機能しません。
ところで、私のシリアライザーはリレーションを使用しており、レコードのページ付けにページジーも使用しています。
gemfile に activemodel-serializer と activemodel-serializer-xml の両方があります
サンプル: @records = Model.where(条件)
XML 形式の結果:
<?xml version="1.0" encoding="UTF-8"?>
<models type="array">
<model>
<id type="integer">1</id>
<name type="string"> name1 </name>
<status type="string"> active </status>
</model>
</models>
JSON 形式の結果: { id: 1, name: ‘name1’, model_associate: [ { id: 1, name: ‘ma_name1’ } ] }
期待される出力:
<?xml version="1.0" encoding="UTF-8"?>
<models type="array">
<model>
<id type="integer">1</id>
<name type="string"> name1 </name>
<model_associates type="array">
<model_associate>
<id type="integer">1</id>
<name type="string">ma_name1</name>
<model_associate>
</model_associates>
</model>
</models>
私はRails 7、Ruby 3.0を使用しています
解決策
答え 1:
01 to_xml は、rails 環境に activemodel-serializers-xml をインストールした後に使用できます。
02 activemodel-serializers-xml は 2 つの方法でインストールできます
gem install activemodel-serializers-xml (ただし、rails 環境では機能しませんでした)
Rails 環境で作業するには、Gemfile を追加するか、バンドルを使用します
bundle add activemodel-serializers-xml
bundle install
03 モデルを作成し、ActiveModel::Serializers::Xml を含める
class User < ApplicationRecord
include ActiveModel::Serializers::Xml
end
04 コントローラーを作成し、お気に入りのメソッドに進みます。 「show」と言ってユーザーを見つけ、以下のように to_xml を使用します。
class UsersController < ApplicationController
def show
@user = User.find(1)
xml = @user.to_xml
puts xml # You may check by printing on console.
render xml: xml # render plain: xml
end
end
回答 2: activemodel-serializers-xml がインストールされ、環境に認識されている限り、機能します。コンソールで直接テストするには、次のプログラムを使用します。それを「xmltest.rb」として保存し、コンソールで次のように実行します。
ruby xmltest.rb
動作しない場合は、activemodel-serializers-xml が正しくインストールされていません。
コードは次のとおりです。データベースとテーブルに合わせて変更します。
require "active_record"
require "activemodel-serializers-xml"
ActiveRecord::Base.establish_connection(
:adapter => "mysql2",
:host => "127.0.0.1",
:username => "root",
:password => "",
:database => "test",
)
class User < ActiveRecord::Base #ApplicationRecord
include ActiveModel::Serializers::Xml
end
user = User.find(1)
xml = user.to_xml
puts xml