改变Rails的默认JSON / XML序列化中包含的字段

时间:2011-08-26 17:05:15

标签: ruby-on-rails-3 web-services

我正在编写一个Web服务来返回用户的详细信息。在控制器中,我只是render :xml => user and return。但是,并非返回我的User模型的所有字段,并且我在模型中没有看到任何指示要包含或排除哪些字段的内容。

型号:

class User < ActiveRecord::Base
  devise :database_authenticatable,
         :recoverable, :rememberable, :trackable, :validatable

  attr_accessible :email, :password, :password_confirmation, :remember_me, :first_name, :last_name
end

示例:

irb(main):003:0> @user = User.find(3)
=> #<User id: 3, email: "me@me.me", encrypted_password: <redacted>, reset_password_token: nil, reset_password_sent_at: nil, remember_created_at: nil, sign_in_count: 11, current_sign_in_at: "2011-08-24 22:50:44", last_sign_in_at: "2011-08-24 06:18:41", current_sign_in_ip: "1.2.3.4", last_sign_in_ip: "1.2.3.4", created_at: "2011-08-23 17:09:28", updated_at: "2011-08-26 04:01:01", controller: false, admin: false, chargify_customer_id: 1234, chargify_subscription_id: 1234, first_name: "Me", last_name: "Me", chargify_subscription_state: "active">

我的render当前正在为同一位用户返回的内容:

<?xml version="1.0" encoding="UTF-8"?>
<user>
  <last-name>Me</last-name>
  <email>me@me.me</email>
  <first-name>Me</first-name>
</user>

至少,我需要包含id字段;总的来说,我想更好地理解你如何控制所包含的内容和不包含的内容。

1 个答案:

答案 0 :(得分:4)

序列化发生在as_json/as_xml方法中。默认情况下,这些方法将所有模型属性序列化为json / xml。但是,devise会隐藏其ActiveRecord扩展所生成的某些属性。这就是为什么你没有获得密码字段的原因。

您可以通过覆盖用户模型中的to_xml方法来控制xml中包含哪些属性。

  def as_xml(options = {})
    default_options = {
      :only => [:id, :first_name, :last_name, :email]
    }
    xml_options = options.blank? ? default_options : options
    super xml_options
  end

您还可以包含模型的自定义方法。

  def as_xml(options = {})
    default_options = {
      :only => [:id, :first_name, :last_name, :email],
      :methods => [:some_custom_method]
    }
    xml_options = options.blank? ? default_options : options
    super xml_options
  end

您可以在此处详细了解序列化: http://api.rubyonrails.org/classes/ActiveRecord/Serialization.html