Tutorial/API de tipos de cambio para Ruby on Rails

API de tipos de cambio para Ruby on Rails

API de tipos de cambio para Ruby on Rails. Guía práctica con código, caché y metadatos de frescura.

ERexchangerate.dev·Sep 20, 2026·7 min de lectura

Implementa esta integración en el servidor sin exponer credenciales y conserva la fuente y la hora de observación.

Puntos clave
Mantén la clave API en el servidor.
Valida códigos de moneda e importes.
Almacena en caché las respuestas correctas.
Muestra la fuente y la hora de observación.

Paso 1

Ejemplo de códigocopy
require "net/http"
require "json"

class ExchangeRateClient
  Error = Class.new(StandardError)

  def convert(from:, to:, amount:)
    from = from.to_s.upcase
    to = to.to_s.upcase
    raise Error, "invalid currency code" unless [from, to].all? { |code| code.match?(/A[A-Z]{3}z/) }

    key = ["fx-convert", from, to, amount.to_d.to_s("F")]
    Rails.cache.fetch(key, expires_in: 60.seconds) do
      uri = URI("https://api.exchangerate.dev/v1/convert/#{from}/#{to}/#{amount}")
      request = Net::HTTP::Get.new(uri)
      request["Authorization"] = "Bearer #{ENV.fetch("EXCHANGERATE_API_KEY")}" 

      response = Net::HTTP.start(uri.host, uri.port, use_ssl: true,
        open_timeout: 2, read_timeout: 5) { |http| http.request(request) }
      raise Error, "exchange-rate API returned #{response.code}" unless response.is_a?(Net::HTTPSuccess)
      JSON.parse(response.body)
    end
  rescue Net::OpenTimeout, Net::ReadTimeout => error
    raise Error, "exchange-rate API timed out: #{error.class}"
  end
end

Paso 2

Ejemplo de códigocopy
class ConversionsController < ApplicationController
  def show
    amount = BigDecimal(params.require(:amount))
    result = ExchangeRateClient.new.convert(
      from: params.require(:from).upcase,
      to: params.require(:to).upcase,
      amount: amount
    )
    render json: result.slice("from", "to", "amount", "rate", "converted",
      "source", "market_session", "data_updated_at")
  rescue ExchangeRateClient::Error, ArgumentError => error
    render json: { error: error.message }, status: :bad_gateway
  end
end

Paso 3

Ejecuta este patrón en el servidor, valida las entradas y conserva los metadatos de la respuesta.

Paso 4

Ejecuta este patrón en el servidor, valida las entradas y conserva los metadatos de la respuesta.

Guía
Estos tipos son indicativos y no son precios de liquidación.
ER
exchangerate.dev
Guías prácticas para integrar datos de divisas.

Sigue leyendo

GuíaAPI de conversión de divisas para desarrolladoresLeer GuíaExchange rates for accounting softwareLeer