您好我正试图用Nokogiri从网站API解析XML。我只是好奇,看看我是否在正确的轨道上。我有一个控制器处理解析,然后我希望模型初始化必要的参数,然后在视图中将其显示为一个简单的列表。我在控制器中想到这样的事情:
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与谷歌地图或其他东西等视图结合起来的好方法的任何提示。现在我得到一个错误说
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
我理解你了吗?!关于我找到问题的模板。这是一个轻微的拼写错误。干杯!
答案 0 :(得分:0)
你真的在这里问两个问题..
是的,差不多。由于你的.each块中没有条件逻辑,所以这样做会更干净:
@news = doc.css('query').map do |n|
#...
News.new(:blah => blah, ...)
end
..但这是一个小问题。
修改强>
您可以通过从解析的xml初始化哈希值然后将其传递给Model.new
来保存一些输入,例如:
@news = doc.css('query').map do |n|
h = {}
h[:header] = n.css('header').text
# ...
News.new(h)
end
编辑2
甚至更短......
@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
事实上#inject
可能会让它更短暂,但我认为这有点混淆。
Dunno,有吗?你没有给出足够的细节来回答这一部分。