2008-10-21 8 views
11

Tengo un modelo de ActiveRecord que me gustaría convertir a xml, pero no quiero todas las propiedades representadas en xml. ¿Hay algún parámetro que pueda pasar al método de renderizado para evitar que una propiedad se represente en xml?Excluyendo algunas propiedades de ActiveRecord de la representación xml en rieles

A continuación se muestra un ejemplo de lo que estoy hablando.

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

produce el siguiente código XML

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

Sin embargo, no quiero que la propiedad de teléfono que se muestra. ¿Hay algún parámetro en el método de renderizado que excluya que las propiedades se procesen en xml? Algo así como el siguiente ejemplo

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

que haría la siguiente XML

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

Respuesta

14

Puede pasar una matriz de modelo de nombres de atributo a los :only y :except opciones, por lo que por su ejemplo sería:

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

El "render: xml" no funcionó, pero el to_xml funcionó. A continuación se muestra un ejemplo

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

yo sólo preguntaba esto mismo, me hizo el cambio en el nivel del modelo, así que no tendría que hacerlo en el controlador, sólo otra opción si usted está interesado.

modelo

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

controlador

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 

puse uno de ellos para JSON y XML en cada objeto, poco conveniente cuando quiero filtrar las cosas fuera de todas las alternativas respuesta formateada. Lo bueno de este método es que incluso cuando recuperas una colección, llamará a este método y devolverá los resultados filtrados.

1

El excepto es bueno, pero debe recordar ponerlo en todas partes. Si está poniendo esto en un controlador, cada método debe tener una cláusula except. Sobreescribo el método serializable_hash en mis modelos para excluir lo que no quiero mostrar. Esto tiene los beneficios de no tener que ponerlo en todos los lugares en los que va a regresar, y también aplicarlo a las respuestas de JSON.

Cuestiones relacionadas