Ваше подозрение правильно. Модуль Devise Authenticatable переопределяет #to_xml и #to_json, чтобы сначала проверить, отвечает ли класс на метод #accessible_attributes, и если да, то вывести ограничен только теми атрибутами, которые возвращаются #accessible_attributes. Код из authenticationtable.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, который включает только указанные вами поля. Вам нужно будет включить каждое поле, которое вы хотите открыть, поскольку, как только вы используете :only, вы превзойдете обычную операцию.
Я не думаю, что в этом случае вы сможете продолжать использовать ярлык respond_with в своем контроллере, потому что вам нужно будет напрямую указать вывод xml. Возможно, вам придется вернуться к блоку respond_to старой школы:
respond_to do |format|
format.xml { render :xml => @users.to_xml(:only => [:field, :field, :field]) }
format.html
end
Как вы уже обнаружили, вы также можете просто добавить дополнительные поля, которые вы хотите открыть, через attr_accessible в классе модели. Тем не менее, это будет иметь дополнительный побочный эффект, заключающийся в том, что эти поля станут массово назначаемыми, и вы можете не обязательно этого хотеть в этой ситуации.
person
Yardboy
schedule
25.06.2011