4

シリアル化データを制御するために gem を使用してactive_model_serializersいますが、奇妙な動作が見られます。私のコードは次のようになります。

モデルとシリアライザー

class User
  include Mongoid::Document
  field :first_name, :type => String
  field :last_name,  :type => String

  def full_name
    first_name + " " + last_name
  end
end

class UserSerializer < ActiveModel::Serializer
  attributes :id, :first_name, :last_name, :full_name
end

コントローラ

class UsersController < ApplicationController
  respond_to :json, :html

  def index
    @users = User.all
    respond_with @users
  end
end

ビュー (アプリ/ビュー/ユーザー/index.html.erb)

...
<script type="text/javascript">
  $(function(){
    // using a backbone collection to manage data
    App.users = new App.Collections.Users(<%= @users.to_json.html_sage %>);
  });
</script>

ここで、ビューをレンダリングすると、full_name属性 (モデル内のメソッドによって生成された) がデータにないことがわかります。

{
  "id": 2,
  "first_name": "John",
  "last_name": "Doe"
}

アクセスすると/users.json(ファイルにある)、正しい JSON が表示resources :usersされます。routes.rb

{
  "id": 2,
  "first_name": "John",
  "last_name": "Doe",
  "full_name": "Jonn Doe"
}

私は何が間違っているのかわかりませんでした - どんな入力も役に立ちます。ありがとう。

4

2 に答える 2

8

HTML ビューでシリアライザーを使用していません。これを試して:

App.users = new App.Collections.Users(<%= UserSerializer.new(@users).to_json.html_safe %>);

この理由は、シリアライザーがメソッドで選択され、respond_withシリアライザーがメソッドを上書きしない.to_jsonためです。

于 2012-12-11T10:10:17.337 に答える
1

@Gaganこれは私にとってはうまくいきます:

App.users = new App.Collections.Users(<%= ActiveModel::ArraySerializer.new(@users).to_json.html_safe %>);

于 2013-06-02T16:42:53.453 に答える