2011-01-27 2 views
3

Я использую ActiveResource для использования веб-сервиса REST, предоставленного Redmine (инструмент отслеживания ошибок). Это вебсервис производит XML, как в следующем:Как сделать XML-анализ ActiveResource более последовательным?

<custom_field name="Issue Owner" id="15">Fred Fake</custom_field> 
<custom_field name="Needs Printing" id="16">0</custom_field> 
<custom_field name="Review Assignee" id="17">Fran Fraud</custom_field> 
<custom_field name="Released On" id="20"></custom_field> 
<custom_field name="Client Facing" id="21">0</custom_field> 
<custom_field name="Type" id="22">Bug</custom_field> 
<custom_field name="QA Assignee" id="23"></custom_field> 
<custom_field name="Company Name" id="26"></custom_field> 
<custom_field name="QA Notes" id="27"></custom_field> 
<custom_field name="Failed QA Attempts" id="28">2</custom_field> 

Однако, когда ActiveResource разбирает, и я итерацию по результатам их печати, я получаю:

Fred Fake 
0 
Fran Fraud 
#<Redmine::Issue::CustomFields::CustomField:0x5704e95d> 
0 
Bug 
#<Redmine::Issue::CustomFields::CustomField:0x32fd963> 
#<Redmine::Issue::CustomFields::CustomField:0x3a68f437> 
#<Redmine::Issue::CustomFields::CustomField:0x407964d6> 
2 

Правильно, он выбрасывает все информацию атрибута из чего-либо со значением, но сохраняет информацию об атрибуте из пустых элементов.

Излишне говорить, что это затрудняет задачу, когда вы пытаетесь найти значение для id 15 (или что-то еще). Теперь я могу ссылаться на вещи по их положению, но это очень хрупкое, потому что эти элементы, вероятно, изменятся в будущем. Я предполагаю, что должен быть какой-то способ заставить ActiveResource сохранять информацию об атрибутах, но так как я не делаю ничего особенного.

(Мое расширение ActiveResource составляет всего пять строк: оно расширяет ActiveResource, определяет URL-адрес, имя пользователя и пароль службы, и все).

Итак, кто-нибудь знает, как я могу заставить ActiveResource не анализировать этот XML так странно?

+0

было бы здорово, если бы вы могли опубликовать кусок кода, который выполняет печать и разбор. – karlcow

+0

С тех пор я удалил его, но в основном это были проблемы = Redmine :: Issue.find (: all); проблемы [0] .custom_fields.each do | field | ставит поле; конец – machineghost

ответ

1

Это известная проблема с ActiveResource очевидно:

https://github.com/rails/rails/issues/588

К сожалению, ничего не появляется, чтобы сделать об этом & вопрос был закрыт. Если вы это догадаетесь, код Rails 3 для обновления ActiveResource и Hash.from_xml для сохранения всех атрибутов приведен ниже, и вы можете создать индивидуальную версию в модуле Redmine, чтобы исправить ее:

https://gist.github.com/971598

Update:

альтернатива, как он появляется ActiveResource will not be part of Rails 4 core и будет выделен как отдельный камень, будет использовать альтернативный ORM для REST API-интерфейсов, как Her.

Ее позволяет использовать пользовательский парсер для вашего XML. Это пример пользовательского парсер называется Redmine :: ParseXML:

https://gist.github.com/3879418

Итак все, что вам нужно сделать, это создать файл конфигурации, как/инициализаторах/her.rb:

Her::API.setup :url => "https://api.xxxxx.org" do |connection| 
    connection.use Faraday::Request::UrlEncoded 
    connection.use Redmine::ParseXML 
    connection.use Faraday::Adapter::NetHttp 
end 

и вы получите Хеш следующим образом:

#<Redmine::Issue(issues) issues={:attributes=>{:type=>"array", :count=>1640}, 
:issue=>{:id=>4326, 
    :project=>{:attributes=>{:name=>"Redmine", :id=>1}}, 
    :tracker=>{:attributes=>{:name=>"Feature", :id=>2}}, 
    :status=>{:attributes=>{:name=>"New", :id=>1}}, 
    :priority=>{:attributes=>{:name=>"Normal", :id=>4}}, 
    :author=>{:attributes=>{:name=>"John Smith", :id=>10106}}, 
    :category=>{:attributes=>{:name=>"Email notifications", :id=>9}}, 
    :subject=>"\n  Aggregate Multiple Issue Changes for Email Notifications\n ", 
    :description=>"\n  This is not to be confused with another useful proposed feature that\n  would do digest emails for notifications.\n ", 
    :start_date=>"2009-12-03", 
    :due_date=>{}, 
    :done_ratio=>0, 
    :estimated_hours=>{}, 
    :custom_fields=>{ 
     :custom_field=>[ 
      {:attributes=>{:name=>"Issue Owner", :id=>15}, "value"=>"Fred Fake"}, 
      {:attributes=>{:name=>"Needs Printing", :id=>16}, "value"=>0}, 
      {:attributes=>{:name=>"Review Assignee", :id=>17}, "value"=>"Fran Fraud"}, 
      {:attributes=>{:name=>"Released On", :id=>20}}, 
      {:attributes=>{:name=>"Client Facing", :id=>21}, "value"=>0}, 
      {:attributes=>{:name=>"Type", :id=>22}, "value"=>"Bug"}, 
      {:attributes=>{:name=>"QA Assignee", :id=>23}}, 
      {:attributes=>{:name=>"Company Name", :id=>26}}, 
      {:attributes=>{:name=>"QA Notes", :id=>27}}, 
      {:attributes=>{:name=>"Failed QA Attempts", :id=>28}, "value"=>2}]}, 
    :created_on=>"Thu Dec 03 15:02:12 +0100 2009", 
    :updated_on=>"Sun Jan 03 12:08:41 +0100 2010"}}>