Встроенный способ конвертировать XML в объект ActiveRecord в Rails 3? - PullRequest
5 голосов
/ 20 апреля 2011

В Rails 3, есть ли способ создать объект ActiveRecord из xml в контроллере без написания кода для его явного разбора? Скажем, например, может ли контроллер получать XML как

<user>
 <first_name>Bob</first_name>
 <last_name>Smith</last_name>
</user>

и создает ли он правильный объект User, похожий на User.new (params [: user])? Это для API.

Ответы [ 2 ]

6 голосов
/ 20 апреля 2011

Да, вы можете сделать это так:

@user = User.new
@user.from_xml(xml_data)

Обновление

При переопределении вы можете сделать что-то вроде этого:

#user.rb
def from_xml(xml_data)
  book = Book.new
  book.from_xml(extract_xml_from(xml_data))
  self.books << book
  super(xml_data)
  save
  book.save
end

Обратите внимание, что наиболее важной строкой в ​​переопределении является super(xml_data), которая позаботится о вызове оригинальной from_xml(xml_data) модели ActiveRecord.Таким образом, вы можете настроить остальное по мере необходимости, но эта строка не нужна, если вы хотите получить оригинальную функциональность.Дайте мне знать, если что-то не понятно.

2 голосов
/ 29 сентября 2011

Я создал гем, xml_active, который может помочь вам без необходимости писать много кода.Вы можете проверить это в https://rubygems.org/gems/xml_active.

Чтобы заставить его создать один объект с ассоциациями, просто сделайте следующее:

book = Book.one_from_xml xml_data

Вы также можете получить xml_active для создания множества объектов из xml вдольс ассоциациями.Есть больше возможностей, но, вероятно, не в рамках этого ответа.Вы можете проверить их на главной странице для драгоценного камня.

UPDATE

xml_active теперь официально удален, и разработка теперь сосредоточена на data_active (см. https://github.com/michael-harrison/data_active), которыйфункциональность xml_active, но в будущих версиях я буду работать для поддержки других форматов

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