在Rails中使用ActiveModel :: Serializer - JSON数据在json和index响应之间有所不同

sa1*_*125 3 ruby json ruby-on-rails mongoid active-model-serializers

我正在使用active_model_serializersgem来控制序列化数据,并看到一些奇怪的行为.我的代码看起来像这样:

模型和序列化器

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
Run Code Online (Sandbox Code Playgroud)

调节器

class UsersController < ApplicationController
  respond_to :json, :html

  def index
    @users = User.all
    respond_with @users
  end
end
Run Code Online (Sandbox Code Playgroud)

view(app/views/users/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>
Run Code Online (Sandbox Code Playgroud)

现在,当我渲染视图时,我看到full_name我的数据中缺少属性(通过模型中的方法生成):

{
  "id": 2,
  "first_name": "John",
  "last_name": "Doe"
}
Run Code Online (Sandbox Code Playgroud)

当我访问/users.json(我resources :users在我的routes.rb文件中)时,我看到了正确的JSON:

{
  "id": 2,
  "first_name": "John",
  "last_name": "Doe",
  "full_name": "Jonn Doe"
}
Run Code Online (Sandbox Code Playgroud)

我看不出我可能做错了什么 - 任何输入都会有所帮助.谢谢.

har*_*arm 7

您没有在HTML视图中使用序列化程序.试试这个:

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

这样做的原因是在respond_with方法中拾取了序列化程序,序列化程序不会覆盖您的.to_json方法.