【问题标题】:ruby "class << self" might cause the error in gem?ruby "class << self" 可能会导致 gem 中的错误?
【发布时间】:2018-09-24 15:17:48
【问题描述】:

我正在尝试使用“HTTP-Cookie”gem。因为我需要它,工作。但是Gem里面好像有个Bug,一年多没维护了。

解决方案是:自己制作。 但我的 Ruby 知识仅限于这一点。 (否则我不会使用 gem 来捕捉 cookie..)

问题来了: 如果您尝试将现有的 YAML 文件导入程序,则会引发此错误:

 7: from C:/Ruby/lib/ruby/gems/2.5.0/gems/http-cookie-1.0.3/lib/http/cookie_jar.rb:324:in `load'
    6: from C:/Ruby/lib/ruby/gems/2.5.0/gems/http-cookie-1.0.3/lib/http/cookie_jar.rb:324:in `open'
    5: from C:/Ruby/lib/ruby/gems/2.5.0/gems/http-cookie-1.0.3/lib/http/cookie_jar.rb:325:in `block in load'
    4: from C:/Ruby/lib/ruby/gems/2.5.0/gems/http-cookie-1.0.3/lib/http/cookie_jar/yaml_saver.rb:44:in `load'
    3: from C:/Ruby/lib/ruby/gems/2.5.0/gems/http-cookie-1.0.3/lib/http/cookie_jar/yaml_saver.rb:44:in `each'
    2: from C:/Ruby/lib/ruby/gems/2.5.0/gems/http-cookie-1.0.3/lib/http/cookie_jar/yaml_saver.rb:45:in `block in load'
    1: from C:/Ruby/lib/ruby/gems/2.5.0/gems/mechanize-2.7.5/lib/mechanize/cookie_jar.rb:22:in `add'
C:/Ruby/lib/ruby/gems/2.5.0/gems/http-cookie-1.0.3/lib/http/cookie_jar.rb:108:in `add': undefined method `acceptable?' for #<Hash:0x0000000006c9d758> (NoMethodError)

表示:没有方法错误,因为方法“可接受?”无法在 cookie 类中找到。当我调查它时,我看到它就在那里。但它不在“class Cookie”中,它在“class

据我了解,

所以我的想法:

  1. 我使用 gem 提供的加载功能
  2. gem 需要“cookie”(.rb)。
  3. Gem 加载“Class self”,但不将该类读取为“cookie”。它读作“class.self”
  4. MRI 告诉我:我们没有找到方法为“可接受?”的类 cookie。

我的问题:

  1. 我说的对吗?

  2. 我现在可以做些什么来解决这个问题?将“class

【问题讨论】:

  • 这是说在哈希上没有平均可接受的方法。你确定你用对了吗?
  • 嗨,谢谢你的回答。但愿如此。它需要一个 yaml 文件。它的代码是:codecookiefile = "kekstopf.yaml" jar = HTTP::CookieJar.new jar.load(cookiefile) if File.exist?(cookiefile) code
  • 嗨蒂姆!要弄清楚这里发生了什么,我们需要查看您的代码(生成此错误)和您尝试加载的文件的内容(kekstopf.yaml)。另外,您是使用 gem 保存此文件,还是来自其他地方?
  • 嗨,迈克,感谢您的回答。因为我无法了解如何在 stackoverflow 上很好地格式化任何内容,所以我将这两个文件都发布在了 pastebin 上。 pastebin.com/HwMquYCE(我在会话 cookie 中更改了会话 ID .. 你知道为什么:D)
  • 您是否使用 gem 生成了 yaml?宝石描述中有关于此的警告

标签: ruby rubygems mechanize httpcookie


【解决方案1】:

根据 gem 文档,YAML 文件格式存在已知问题,请参阅https://github.com/sparklemotion/http-cookie#file-formats

但是你可以只解析你可以使用纯 txt cookie 格式并只解析你的示例 yaml 文件,这样每一行只包含没有键的域和值,空格分隔如下:

#cookie.txt
.springlane.de false false 1 pcah / no_restriction false true "0" QXVleEFoai8zR0xzJKHKJH56J5NUNkam5PbGVHenp6dz0K
.springlane.de 1526287010.834168 false false 2 pcar%5fUkVTV45RDMmA%3d%3d / no_restriction false false "0" K0lnSk94SGw1a1YiohzghbZrdfztUIOKHa25wZW03ek91RFJsK3R6a0I2YitpL0E5MFRTdEZ3PT0K

#and in your ruby script

require 'rubygems'
require 'mechanize'
require 'open-uri'
require 'http-cookie'

agent = Mechanize.new { |agent|
  agent.user_agent_alias = 'Windows Mozilla'
}
cookiefile = "cookie.txt"
jar = HTTP::CookieJar.new
jar.load(cookiefile) if File.exist?(cookiefile)
seite = agent.get("https://www.springlane.de/magazin/rezeptideen/american-cookies-backen/")
seite.search('img').each {|n| puts "\n #{n}"}

测试无异常。如果您想为有问题的 gem 做出贡献,您需要编写测试。但您似乎只需要将 YAML 文件转换为标准 cookie 文本格式即可。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多