2008-10-21 2 views
11

У меня есть модель ActiveRecord, которую я хотел бы преобразовать в xml, но я не хочу, чтобы все свойства отображались в xml. Есть ли параметр, который я могу передать в метод рендеринга, чтобы свойство не отображалось в xml?Исключая некоторые свойства ActiveRecord из рендеринга xml в rails

Ниже приведен пример того, о чем я говорю.

def show 
    @person = Person.find(params[:id]) 
    respond_to do |format| 
    format.xml { render :xml => @person } 
    end 
end 

производит следующие XML

 
<person> 
    <name>Paul</name> 
    <age>25</age> 
    <phone>555.555.5555</phone> 
</person> 

Однако, я не хочу, свойство телефон будет показано. Есть ли какой-нибудь параметр в методе рендеринга, который исключает отображение свойств в xml? Вид, как в следующем примере

def show 
    @person = Person.find(params[:id]) 
    respond_to do |format| 
    format.xml { render :xml => @person, :exclude_attribute => :phone } 
    end 
end 

который сделает следующий XML

 
<person> 
    <name>Paul</name> 
    <age>25</age> 
</person> 

ответ

14

Вы можете передать массив модели имен атрибутов к :only и :except вариантов, поэтому для примера это будет:

def show 
    @person = Person.find(params[:id]) 
    respond_to do |format| 
    format.xml { render :text => @person.to_xml, :except => [:phone] } 
    end 
end 
2

«render: xml» не работал, но to_xml работал. Ниже приведен пример

def show 
    @person = Person.find(params[:id]) 
    respond_to do |format| 
    format.xml { render :text => @person.to_xml(:except => [:phone]) } 
    end 
end 
7

Я просто было интересно, это то же самое, я сделал изменения на уровне модели, так что я бы не сделать это в контроллере, только другой вариант, если вы заинтересованы.

модель

class Person < ActiveRecord::Base 
def to_xml 
    super(:except => [:phone]) 
end 
def to_json 
    super(:except => [:phone]) 
end 
end 

контроллер

class PeopleController < ApplicationController 
    # GET /people 
    # GET /people.xml 
    def index 
    @people = Person.all 

    respond_to do |format| 
     format.html # index.html.erb 
     format.xml { render :xml => @people } 
     format.json { render :json => @people } 
    end 
    end 
end 

Я поставил одну из них для JSON и XML на каждом объекте, вроде удобно, когда я хочу, чтобы отфильтровать вещи из каждой альтернативы отформатированный ответ. Замечательная вещь об этом методе заключается в том, что даже когда вы получите сбор обратно, он вызовет этот метод и вернет отфильтрованные результаты.

1

За исключением хорошо, но вы должны помнить, чтобы его повсюду. Если вы помещаете это в контроллер, каждый метод должен иметь предложение except. Я переписываю метод serializable_hash в своих моделях, чтобы исключить, что я не хочу показывать. Это имеет преимущество, заключающееся в том, что вы не ставите его на все места, куда собираетесь вернуться, а также обращаетесь к ответам JSON.