小编Aar*_*mas的帖子

尝试使用nokogiri在xml文件中获取cdata标签内的内容

我已经看到了几件事,但到目前为止似乎没有任何工作.我在rails 3 ruby​​ 1.9.2上使用nokogiri通过url解析xml.

xml的片段如下所示:

<NewsLineText>
  <![CDATA[
  Anna Kendrick is ''obsessed'' with 'Game of Thrones' and loves to cook, particularly     creme brulee.
  ]]>
</NewsLineText>
Run Code Online (Sandbox Code Playgroud)

我试图解析这个以获取与NewsLineText相关联的文本

r = node.at_xpath('.//newslinetext') if node.at_xpath('.//newslinetext')
s = node.at_xpath('.//newslinetext').text if node.at_xpath('.//newslinetext')
t = node.at_xpath('.//newslinetext').content if node.at_xpath('.//newslinetext')
puts r
puts s ? if s.blank? 'NOTHING' : s
puts t ? if t.blank? 'NOTHING' : t
Run Code Online (Sandbox Code Playgroud)

我得到的回报是

<newslinetext></newslinetext>
NOTHING
NOTHING
Run Code Online (Sandbox Code Playgroud)

所以我知道我的标签被正确命名/拼写以获取newslinetext数据,但cdata文本永远不会出现.

我需要用nokogiri来获取此文本?

ruby cdata nokogiri xml-parsing ruby-on-rails-3.1

15
推荐指数
1
解决办法
9220
查看次数

使用rabl和集合,无法添加额外的子节点

我有一些我希望在json响应中显示的文章.我还想导出一个关于所请求的json请求类型的节点.

index.json.rabl

collection @articles => :headlines
extends 'articles/show'
Run Code Online (Sandbox Code Playgroud)

show.json.rabl

object @article
attributes :foo
Run Code Online (Sandbox Code Playgroud)

所以去articles.json给了我:

 {"headlines":[{"foo":thing1},{"foo":thing2}]}
Run Code Online (Sandbox Code Playgroud)

我想做的是得到这样的结果:

{"rss":{"name":"articles","woot":"what?"},
{"headlines":[{"foo":thing1},{"foo":thing2}]}
Run Code Online (Sandbox Code Playgroud)

我已经尝试将node(:rss){"yadda yadda"}放在index.json.rabl文件中,但是只将节点:rss添加到每篇文章中.

我试过用

 glue @article do
    node(:rss) { "yadda yadda" }
 end
Run Code Online (Sandbox Code Playgroud)

在索引和显示文件中都没有像我希望的那样工作.

我尝试了很多其他的东西,但此时我只是猜测.

json ruby-on-rails-3 rabl

5
推荐指数
1
解决办法
3724
查看次数

在模型上使用if作用域

我正在尝试创建一个名为:current_season的命名范围,它将正确识别与我们所在年份相关的记录.除了我希望6月及以后的所有内容使用当前年份以及6月之前的所有内容时,我非常容易使用去年.

在rails 3.1我可以轻松使用:

scope :current_season, lambda { where('season = ?',Time.now.year) } if Time.now.month >= 6
Run Code Online (Sandbox Code Playgroud)

如果我们在年底时才能使范围有效:

scope :current_season, lambda { where('season = ?',Time.now.year - 1) } if Time.now.month < 6
Run Code Online (Sandbox Code Playgroud)

但是,将它全部命名为两次并且不使用if/else类型的东西或者能够调用我在下面定义的内容以显示确切的年份似乎是浪费的,例如:

scope :current_season, lambda { where('season = ?',:current_season_year) } 

def current_season_year
  if Time.now.month >= 6
    Time.now.year
  else
    Time.now.year - 1
  end
end
Run Code Online (Sandbox Code Playgroud)

但是,当我尝试时,这只是嘲笑我.有更干净的方式吗?我也有一个范围:last_season和范围:previous_season最有可能,他们将遵循类似的逻辑.

提前感谢任何建议!

ruby-on-rails ruby-on-rails-3.1

4
推荐指数
1
解决办法
5472
查看次数

如何从rake任务将对象传递给rabl视图

我正在尝试使用rabl从rake任务创建一个json文件.下面我有要测试的简化版本.

当我通过url查看'articles.json'或'articles/2.json'时,我得到了预期的json响应.

但是当我尝试通过rake任务运行它时,它在创建的jsonFile中的@articles总是有一个空值.它将使index.json.rabl视图呈现与@ articles.count相同的次数,但值始终为null.

那么如何将我的rake任务中创建的@articles对象传递给Rabl.render?

index.json.rabl

@feedName ||= 'default'
node(:rss) { partial('articles/rss), :object => @feedName }
node(:headlines) { partial('articles/show'), :object => @articles }
Run Code Online (Sandbox Code Playgroud)

show.json.rabl

object @article
attributes :id,:body
....
Run Code Online (Sandbox Code Playgroud)

exports.rake

task :breakingnews => :config do
  filename = 'breakingnews.json'
  jsonFile = File.new(filename)
  @articles = Article.limit(10)
  n = Rabl::renderer.json(@articles,'articles/index',view_paths => 'app/views')
  jsonFile.puts b
  jsonFile.close
Run Code Online (Sandbox Code Playgroud)

json ruby-on-rails-3 rabl

2
推荐指数
1
解决办法
2205
查看次数