2011-08-26 2 views
2

사용자 정보를 반환하는 웹 서비스를 작성 중입니다. 컨트롤러에서는 간단히 render :xml => user and return입니다. 그러나 내 사용자 모델의 모든 필드가 반환되는 것은 아니며 포함하거나 제외 할 필드를 나타내는 모델에는 아무 것도 표시되지 않습니다.레일스의 기본 JSON/XML 직렬화에 포함 된 필드 변경하기

모델 :

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

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

예 : 최소한

<?xml version="1.0" encoding="UTF-8"?> 
<user> 
    <last-name>Me</last-name> 
    <email>[email protected]</email> 
    <first-name>Me</first-name> 
</user> 

, 나는 id을 포함해야합니다 : 현재 동일한 사용자에 대해 반환 render 내 어떤

irb(main):003:0> @user = User.find(3) 
=> #<User id: 3, email: "[email protected]", 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"> 

들; 전반적으로, 나는 당신이 포함 된 것을 통제하는 방법과 그렇지 않은 것을 통제하는 방법을 더 잘 이해하고 싶습니다.

답변

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 

모델의 사용자 정의 방법을 포함 할 수도 있습니다. http://api.rubyonrails.org/classes/ActiveRecord/Serialization.html

+1

감사 :

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 

현재 직렬화에 대한 자세한 내용을보실 수 있습니다. 내 모델에 as_xml을 배치하지 못했습니다. 디버깅 로거를 추가하여 확인되지 않았습니다. 내 재정의를 재정의 한 기분 전환 용 as_xml 재정의가 있습니다. ;-) 그러나 제안 된대로 self.to_xml을 직접 호출하면 옵션 해시를 사용하여 모델에 to_api 메서드를 추가 했으므로 제대로 작동하는 것 같습니다. – tkrajcar

관련 문제