Ваше подозрение правильно .Модуль Devise Authenticatable переопределяет # to_xml и # to_json , чтобы сначала проверить, отвечает ли класс методу # available_attributes , и если это происходит, то вывод ограничентолько те атрибуты, которые возвращает #accessible_attributes.Код от authenticatable.rb находится здесь:
%w(to_xml to_json).each do |method|
class_eval <<-RUBY, __FILE__, __LINE__
def #{method}(options={})
if self.class.respond_to?(:accessible_attributes)
options = { :only => self.class.accessible_attributes.to_a }.merge(options || {})
super(options)
else
super
end
end
RUBY
end
Вы заметите, что этот код объединяет результат #accessible_attributes с любыми переданными параметрами.Таким образом, вы можете указать опцию : only , например:
.to_xml(:only => [:field, :field, :field])
Это заменит ограничение, наложенное Devise, и создаст вывод xml, включающий только указанные вами поля.Вам нужно будет включить все поля, которые вы хотите раскрыть, поскольку, как только вы используете: только вы превзойдете нормальную работу.
Я не думаю, что вы сможете продолжать использовать response_with ярлык в вашем контроллере в этом случае, потому что вам нужно будет указать вывод xml напрямую.Возможно, вам придется вернуться к блоку старой школы response_to :
respond_to do |format|
format.xml { render :xml => @users.to_xml(:only => [:field, :field, :field]) }
format.html
end
Как вы уже обнаружили, вы также можете просто добавить дополнительные поля, которые вы хотите открыть, с помощью attr_accessible в классе модели.Однако это приведет к дополнительному побочному эффекту присвоения этих полей массовому назначению, и вы не обязательно захотите этого в этой ситуации.