Techioz Blog

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 つの方法でインストールできます

  1. gem install activemodel-serializers-xml (ただし、rails 環境では機能しませんでした)

  2. 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