Исключение некоторых свойств ActiveRecord из рендеринга xml в рельсах
У меня есть модель ActiveRecord, которую я хотел бы преобразовать в xml, но мне не нужны все свойства, представленные в xml. Есть ли параметр, который я могу передать в метод рендеринга, чтобы свойство не отображалось в xml?
Ниже приведен пример того, о чем я говорю.
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>
Ответы
Ответ 1
Вы можете передать массив имен атрибутов модели в параметры :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
Мне просто интересно было то же самое, я внес изменения на уровне модели, поэтому мне не пришлось бы делать это в контроллере, просто еще один вариант, если вы заинтересованы.
модель
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 для каждого объекта, что удобно, когда я хочу фильтровать информацию из любого альтернативного отформатированного ответа. Замечательная вещь об этом методе заключается в том, что даже когда вы получите обратно коллекцию, он вызовет этот метод и вернет отфильтрованные результаты.
Ответ 3
"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
Ответ 4
За исключением хорошо, но вы должны помнить, чтобы его повсюду. Если вы помещаете это в контроллер, каждый метод должен иметь предложение except. Я переписываю метод serializable_hash в своих моделях, чтобы исключить, что я не хочу показывать. Это имеет преимущество, заключающееся в том, что вы не ставите его на все места, куда собираетесь вернуться, а также применяете ответы JSON.