简体   繁体   English

如何使用Ruby 1.8.7将哈希传递到class_eval'ed方法中?

[英]How can I pass a hash into a class_eval'ed method with Ruby 1.8.7?

I'm trying to mock the OpenID handling in my cucumber tests. 我正在尝试在黄瓜测试中模拟OpenID处理。 For this purpose I use the following method: 为此,我使用以下方法:

def set_result_of_openid_authentication(result_type, profile_data = nil)
  ActionController::Base.class_eval "
    def begin_open_id_authentication(identity_url, options = {})
      yield [OpenIdAuthentication::Result.new('#{result_type}'.to_sym), identity_url, #{profile_data}]
    end
  "
end

# example usage
set_result_of_openid_authentication :successful, 'email' => 'dhofstet@example.com'

This works fine with Ruby 1.9.2, but with Ruby 1.8.7 I get the following compile error: 这在Ruby 1.9.2上可以正常工作,但是在Ruby 1.8.7下,我得到以下编译错误:

(eval):5:in `set_result_of_openid_authentication': compile error
(eval):3: syntax error, unexpected tIVAR, expecting kDO or '{' or    '('    
...identity_url, emaildhofstet@example.com]

For some reason the hash is not preserved... Is there some workaround to make it work with both Rubies? 由于某种原因,哈希值未保留。是否存在一些变通办法,使其可以同时与两个红宝石一起使用?

Thanks. 谢谢。

It looks like the problem is that inside your class_eval the interpolated string #{profile_data} is coming through as emaildhofstet@example.com which is the to_s representation of a Hash in 1.8.7. 看来问题是在您的class_eval内部,内插字符串#{profile_data}是作为emaildhofstet@example.com通过的,它是1.8.7中Hashto_s表示。

If you replace this with #{profile_data.inspect} then it should come come through as {'email' => 'dhofstet@example.com'} as required. 如果将其替换为#{profile_data.inspect}则它应根据需要以{'email' => 'dhofstet@example.com'}形式出现。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM