Чтобы ответить на мой собственный вопрос, я не думаю, что savon может отслеживать пространства имен.Однако, покопавшись в коде Савона, я понял, что могу решить эту проблему, поскольку запросы SOAP не столь важны для моего приложения.
Вот хорошее решение для работы с несколькими пространствами имен:
def login_request
request = Savon::SOAPRequest.new(globals).build(
soap_action: :login,
cookies: locals[:cookies],
headers: locals[:headers]
)
request.headers['Content-Type'] = 'application/soap+xml'
request.url = @url
request.body = login_xml_string
HTTPI.post(request)
end
def globals
@_globals ||= Savon::GlobalOptions.new
end
def locals
@_locals ||= Savon::LocalOptions.new
end
Где login_xml_string
- это метод, возвращающий конвертируемый SOAP конверт на основе файла xml.erb
.Например,
def login_xml_string
@view_paths.render(file: 'app/views/path/to/file/login.xml.erb',
locals: { user_name: @username, password: @password, url: @url}
).gsub(/\n[\s+]{0,}/, '')
end
И @view_paths
установлены на ActionView::Base.new(ActionController::Base.view_paths, {})
То же самое касается остальных действий SOAP, которые мне нужно вызвать.
Я не говорюэто лучший подход, но он облегчил мне жизнь с пространствами имен, передав их местным жителям.