Исключение некоторых свойств ActiveRecord из рендеринга xml в рельсах - PullRequest
11 голосов
/ 21 октября 2008

У меня есть модель 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>

Ответы [ 4 ]

14 голосов
/ 21 октября 2008

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

def show
  @person = Person.find(params[:id])
  respond_to do |format|
    format.xml { render :text => @person.to_xml, :except => [:phone] }
  end
end
7 голосов
/ 19 ноября 2009

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

модель

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 для каждого объекта, что довольно удобно, когда я хочу отфильтровать вещи из каждого альтернативного отформатированного ответа. Крутая вещь в этом методе заключается в том, что даже когда вы вернете коллекцию, он вызовет этот метод и вернет отфильтрованные результаты.

2 голосов
/ 21 октября 2008

"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
1 голос
/ 16 марта 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...