小编Jan*_*rik的帖子

在单个节点上使用XPath会返回所有节点中的元素

我正在解析一个看起来像这样的XML文档:

<MyBook>
   <title>Favorite Poems</title>
   <issn>123-456</issn>
   <pages>45</pages>
</MyBook>
<MyBook>
   <title>Chocolate Desserts</title>
   <issn>654-098</issn>
   <pages>100</pages>
</MyBook>
<MyBook>
   <title>Jabberwocky</title>
   <issn>454-545</issn>
   <pages>19</pages>
</MyBook>
Run Code Online (Sandbox Code Playgroud)

我使用xpath拉出MyBook节点并迭代它们,如下所示:

xmldoc.xpath("//MyBook").each do |node|
   mytitle=node.xpath("//title").text
   puts mytitle
end
Run Code Online (Sandbox Code Playgroud)

输出看起来像这样:

Favorite PoemsChocolateDessertsJabberwocky
Favorite PoemsChocolateDessertsJabberwocky
Favorite PoemsChocolateDessertsJabberwocky
Run Code Online (Sandbox Code Playgroud)

好像节点真的是整个xmldoc.但是,如果我在迭代器中打印出节点,那么每次它都是我期望的,只有一个MyBook节点.我需要能够连续地从每个节点中拉出子节点,而不是从整个文档中拉出所有相同类型的子节点.我究竟做错了什么?

ruby xml parsing nokogiri

43
推荐指数
1
解决办法
1万
查看次数

如何设置url helper方法参数的默认值?

我使用语言代码作为前缀,例如www.mydomain.com/en/posts/1.这是我在routes.rb中所做的:

scope ":lang" do
  resources :posts
end
Run Code Online (Sandbox Code Playgroud)

现在我可以轻松使用url helpers,例如:post_path(post.id, :lang => :en).问题是我想在cookie中使用一个值作为默认语言.所以我可以写post_path(post.id).

有没有办法如何在url helpers中设置参数的默认值?我找不到网址助手的源代码 - 有人能指出我正确的方向吗?

另一种方式:我已经尝试在routes.rb中设置它,但它仅在启动时评估,这对我不起作用:

scope ":lang", :defaults => { :lang => lambda { "en" } } do
  resources :posts
end
Run Code Online (Sandbox Code Playgroud)

ruby-on-rails ruby-on-rails-3

7
推荐指数
3
解决办法
4265
查看次数

每次请求都会重新加载模块,因此初始化数据会丢失

我将值存储在模块内的类变量中,例如:

module TranslationEnhancer
  def self.install! klass
    @dictionaries ||= [] << klass
  end
  ...
end
Run Code Online (Sandbox Code Playgroud)

我从config/initializers中的初始化程序中调用它:

require Rails.root + "lib" + "translation_enhancer.rb"
TranslationEnhancer::install! TranslationDictionary
Run Code Online (Sandbox Code Playgroud)

现在,如果我在开发环境中启动服务器,在第一次请求期间一切正常.但是,在那个请求之后,@dictionaries突然变为零.我已经在TranslationEnhancer中评论了所有其他代码,所以我绝对相信每次执行请求时都必须重新加载整个模块.

我试图将模块移到lib目录之外(将其移动到lib_unloadable),然后我尝试了:

ActiveSupport::Dependencies.explicitly_unloadable_constants << "TranslationEnhancer" 
Run Code Online (Sandbox Code Playgroud)

但又失败了.我不知道如何解决这个问题,请帮忙.

得到Ruby 1.9.2 @ Rails 3.1.rc4.

编辑:我知道我可以将字典设置为常量.但我想使用TranslationEnhancer作为库 - 所以我可以在不同的项目中不加改变地使用它并安装不同的目录,例如:

TranslationEnhancer.install! EnglishDirectory, FrenchDirectory
Run Code Online (Sandbox Code Playgroud)

这些值在运行时期间会发生变化,它们只会将项目更改为项目.

ruby ruby-on-rails ruby-on-rails-3

7
推荐指数
1
解决办法
1299
查看次数

标签 统计

ruby ×2

ruby-on-rails ×2

ruby-on-rails-3 ×2

nokogiri ×1

parsing ×1

xml ×1