2013-04-03 7 views
0

Я разбираю XML из API и показываю их на одной странице, хотя я разбил их на 30 страниц.Как просмотреть каждый отдельный элемент набора узлов?

Я хочу просмотреть каждый отдельно с помощью метода link_to, а затем обновить атрибуты, которые, в свою очередь, могут быть отправлены обратно в API в формате XML. То, что я не делаю, это сохранение модели, просто отображение. Можно ли обрабатывать возвращаемые результаты как объекты?

Это XML:

<entry> 
<id>xxx</id> 
<updated>xxx</updated> 
<category scheme="xxx" term="xxx"/> 
<title type="text">xxx</title> 
<link rel="xxx" type="xxx" href="xxx"/> 
<link rel="xxx"/>  
<link rel="xx" type="xxx" href="xxx"/> <link rel="xx" type="axx" href="xxx"/> 
<gd:email rel="xxx" address="xxx" primary="xx"/> 
</entry> 

Это контроллер:

def show 
    @contact = getcontact.find(params[:title]) 
end 

Это getcontact метод:

doc = Nokogiri::XML.parse(open(url)) 
doc.xpath('//xmlns:feed/xmlns:entry[xmlns:title[node()]]') 

Это маршрут:

match 'contacts/xmlns:title' => 'contacts#show' 

Все контакты Вид:

<% @mycontacts.each do |c| %> 
Name: <%= c.xpath('xmlns:title').text %> 
Email: <%= c.xpath('gd:email/@address').text %> 
<%= link_to "Update Contact", contact_path(c.xpath('xmlns:title').text) %></p> 

<% end %> 

Шоу вид:

<%= @contact.xpath('xmlns:title') %> 
<%= @contact.xpath('gd:email/@address') %> 

Когда я нажимаю на ссылку, чтобы просмотреть отдельный контакт, я получаю сообщение об ошибке:

undefined method `xpath' for #<Enumerator:0x3cc6570> 

EDIT:

Было бы лучше сохранить все в модели, обновить в приложении, а затем преобразовать в XML и отправить его обратно? Это кажется немного длинным, но это будет лучшая практика?

ответ

1

Да, я бы создал модель, инкапсулирующую API и методы поиска. Кроме того, я бы использовал HTTParty, который предназначен именно для этого прецедента. Он будет автоматически выполнять преобразования в XML и из него. (Хотя, если это RSS-канал, я бы, вероятно, использовал dedicated RSS parser)

Это разделение не будет «длинным намотчиком», на самом деле оно будет более чистым и может быть более эффективным, поскольку вы можете кэшировать или даже просто memoize в модели, минимизирующей количество выборки, которую вы должны сделать.

+0

Спасибо за ответ, я думал, что существует способ изменить детали XML на лету, но вы правы, получите его в модели, он чище. Я попадаю на корпус с HTTParty – Richlewis

Смежные вопросы