Как я могу передать хэш в метод class_eval'ed с Ruby 1.8.7? - PullRequest
2 голосов
/ 02 сентября 2010

Я пытаюсь смоделировать обработку 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]

По какой-то причине хеш не сохраняется ... Есть ли обходной путь, чтобы он работал с обоими Рубинами?

Спасибо.

1 Ответ

1 голос
/ 02 сентября 2010

Похоже, проблема в том, что внутри вашей class_eval интерполированная строка #{profile_data} проходит как emaildhofstet@example.com, что является to_s представлением Hash в 1.8.7.

Если вы замените это на #{profile_data.inspect}, тогда оно должно прийти как {'email' => 'dhofstet@example.com'}, как требуется.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...