kitak blog

Kみたいなエンジニアになりたいブログ

active_model_serializers から jbuilder に乗り換えるためにスクリプトを書いた

こんにちは。焼き鳥は、ぼんじりとじゅんけいが好きです、きたけーです。

最近、プロジェクトでJSONを生成するときに rails-api/active_model_serializers · GitHub を使っていたのを、rails/jbuilder · GitHub に乗り換えることになったので、ぽちぽちコードを書いていたのですが、刺身の上にたんぽぽ載せてる感がはんぱないので、簡単に変換するスクリプトを書きました(がーっと書いたので改善とか工夫できるところはたくさんありそう)。こんなかんじ

require 'active_support/core_ext'

class_name = ''
ARGF.each do |line|
  if /class\s+(\w+)Serializer\s/ =~ line
    class_name = $1.downcase
  elsif /attributes\s+(.+)/ =~ line
    $1.chomp.split(/\,\s+/).each do |attribute|
      attribute.sub!(/\A:/, '')
      puts "json.#{attribute} @#{class_name}.#{attribute}"
    end
  elsif /attribute\s+\:(.+)\,\s+key\:\s+\:(.+)/ =~ line
    puts "json.#{$2.underscore} @#{class_name}.#{$1}"
  end
end

つかいかた

bundle exec ruby ams_to_jbuilder.rb some_serializer.rb

こういうシリアライザのクラスがあったら

class SomeSerializer < ActiveModel::Serializer
  attributes :id, :alpha, :bravo, :charlie
  attribute :foo, key: :foo
  attribute :bar, key: :bar
  attribute :baz, key: :baz
end

こういうかんじで出力される

json.id @some.id
json.alpha @some.alpha
json.bravo @some.bravo
json.charlie @some.charlie
json.foo @some.foo
json.bar @some.bar
json.baz @some.baz

追記

jbuilderの使い方みてたら、出力内容よりももっと簡潔に書けることに気づいた...