Rails の Serializer がよくわからないので、使い方など確認してみる。
目次
参考
- Techracho - Rails: ActiveModelSerializers で API を作る–Part 1(翻訳)
- Qiita - ActiveModel::Serializers の痒い所に手が届く使い方
- メドピア開発者ブログ - ActiveModelSerializers を使った所感
シリアライザってなんだ?
シリアライザを調べると、関連ワードとして回路の話や XML など、いろいろなものが出てくる。
データをひとつながりの文字列に起こすのがシリアライザということでいいいらしい。
Rails だと render にオブジェクトをそのまま渡したり、jbuilder を使うことで json を作成していたが、そういった方法の 1 つと解釈しました。
準備
以下コマンドで、user モデルの作成他を行います。
1 | bundle exec rails g scaffold user first_name:string last_name:string |
一旦ここで適当な user を登録します。
登録したら、localhost:3000/users.json にアクセスすると、以下のものを返します。
1 | [ |
active_model_serializers の導入
Gemfile 編集
Gemfile に以下を追記します。
1 | gem 'active_model_serializers', '~> 0.10.0' |
インストール
以下のコマンドを実行します。
1 | bundle install |
このコマンドで、app/serializers/user_serializer.rb
が作成される。
1 | class UserSerializer < ActiveModel::Serializer |
コントローラを編集
app/controllers/users_controller.rb
の index メソッドを編集。
1 | def index |
この段階で、localhost:3000/users.json にアクセスすると、以下のものを返します。
1 | [{ "id": 1 }, { "id": 2 }] |
返して来るものが、id
だけになりました。
この返してくるものは、正しくは json の形式に従っていません。
シリアライザで、処理する記述としては不十分ということでした。adapter: :json
を追記して、app/controllers/users_controller.rb
の index メソッドを以下のように再度編集します。
1 | def index |
この段階で、localhost:3000/users.json にアクセスすると、以下のものを返します。
1 | { "users": [{ "id": 1 }, { "id": 2 }] } |
json の形式として、正しい形になりました。
返却する要素を変更する
ここまでは、id のみ返していましたが今度は他の要素も返してみます。app/serializers/user_serializer.rb
を編集し、first_name
も返すようにします。
1 | class UserSerializer < ActiveModel::Serializer |
localhost:3000/users.json にアクセスすると、以下のものを返すようになります。
1 | { |
シリアライザに関数を定義する
app/serializers/user_serializer.rb
を編集し、name 要素を返却する json に追加します。
name はモデルに定義がありません。
関数で定義します。
1 | class UserSerializer < ActiveModel::Serializer |
localhost:3000/users.json にアクセスすると、以下のものを返すようになります。
1 | { |
name 要素に、[first_name文字列]-[last_name文字列]
が設定されました。
用意した関数が効果しています。
index 以外でも適用する
app/serializers/user_serializer.rb
を以下のように編集します。
1 | def show |
localhost:3000/users/1.json にアクセスすると、以下のものを返します。
1 | { "user": { "id": 1, "name": "A-a" } } |
id=1
の要素のみ、指定したid
とname
を取得できました。
別のシリアライザを指定する
app/serializers/user_ex_serializer.rb
を用意した。
1 | class UserExSerializer < ActiveModel::Serializer |
コントローラを以下のように編集します。
1 | def show |
localhost:3000/users/1.json にアクセスすると、以下のものを返します。
1 | { "user": { "id": 1, "first_name": "A", "last_name": "a" } } |
serializer:
でモデルクラスを指定することで、シリアライザを選択できました。
今回は、シリアライザをというかactive_model_serializers
の使い方の入口を確認しました。
アソシエーションに関する設定もできるので、次はその点を触っておきたいところです。
ではでは。