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

时间:2010-09-02 07:07:33

标签: ruby

我正试图在我的黄瓜测试中模拟OpenID处理。为此,我使用以下方法:

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'

这适用于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]

由于某些原因,哈希值未被保留...是否有一些解决方法可以使它与两个Rubies一起使用?

感谢。

1 个答案:

答案 0 :(得分:1)

问题是,class_eval内插字符串#{profile_data}内部的emaildhofstet@example.comto_s Hash代表#{profile_data.inspect}在1.8.7。

如果您将其替换为{'email' => 'dhofstet@example.com'},则应根据需要将其替换为{{1}}。