Привет, я пытаюсь разобрать XML из API веб-сайтов с помощью Nokogiri. Мне просто любопытно посмотреть, на правильном ли я пути. У меня есть контроллер, который обрабатывает синтаксический анализ, а затем я хотел бы, чтобы модель инициализировала необходимые параметры, а затем отображала их в виде простого списка в представлении. Я думал что-то вроде этого в контроллере:
def index
doc = Nokogiri::XML(open("http://www.mysomething.com/partner/api/1_0/somerandomkeynumber4b0/channel/11number/material/list/").read)
@news = []
doc.css("news").each do |n|
header = n.css("header").text
source_name = n.css("source_name").text
summary = n.css("summary").text
url = i.css("url").text
created_at = i.css("created_at").text
type_of_media = i.css("type_of_media").text
@news << News.new(
:header => header,)
end
а затем Модель:
class News
include ActiveModel::Validations
validates_presence_of :url, :type_of_media
attr_accessor :header, :source_name, :summary, :url, :created_at, :type_of_media
def initialize(attributes = {})
@header = attributes[:header]
@source_name = attributes[:source_name]
@summary = attributes[:summary]
@url = attributes[:url]
@created_at = attributes[:created_at]
@type_of_media = attributes[:type_of_media]
end
Вот как бы вы это сделали?! Не уверен, что я правильно думаю об этом. Может быть, у вас есть какие-нибудь советы о том, как объединить Nokogiri с чем-то еще для просмотра, например, с картами Google или чем-то еще. Прямо сейчас я получаю сообщение об ошибкеMissing template news/index with {:formats=>[:html], :handlers=>[:builder, :rjs, :erb, :rhtml, :rxml], :locale=>[:en, :en]} in view paths
Заранее спасибо!
@noodle: Итак:
@news = doc.css('query').map do |n|
h = {}
%w(header source_name summary url created_at type_of_media).each do |key|
h[key.to_sym] = n.css(key).text
end
News.new(h)
end
Равно:
@news = []
doc.css("news").each do |n|
header = n.css("header").text
source_name = n.css("source_name").text
summary = n.css("summary").text
url = i.css("url").text
created_at = i.css("created_at").text
type_of_media = i.css("type_of_media").text
@news << News.new(
:header => header,)
end
Я правильно вас понял?! Что касается шаблона, я обнаружил проблему. Это была небольшая опечатка. Ваше здоровье!
i
сn
в своем последнем примере, но это достаточно близко :) - person noodl   schedule 12.01.2011