Tengo una aplicación Rails 6 en la que interactúo con el navegador para obtener información (getAccount) de una extensión de Chrome.
En la última línea, hago console.log(account) , que imprime el valor correcto. Sin embargo, quiero guardar la variable de cuenta en mi base de datos. ¿Cómo haría para exponer esa variable de account a Rails para poder enviarla al controlador y guardarla?
<%= link_to "Home", root_path %> <button class="enableEthereumButton">Connect MetaMask</button> <h2>Account: <span class="showAccount"></span></h2> <script> const ethereumButton = document.querySelector('.enableEthereumButton'); const showAccount = document.querySelector('.showAccount'); ethereumButton.addEventListener('click', () => { getAccount(); }); async function getAccount() { const accounts = await ethereum.request({ method: 'eth_requestAccounts' }); const account = accounts[0]; showAccount.innerHTML = account; console.log(account) } </script>Dado que Rails se ejecuta en el servidor mientras este código se ejecuta en el navegador, deberá transmitir esos datos a su backend.
El enfoque más simple sería realizar una solicitud HTTP POST a una ruta en su servidor, que puede registrar directamente la cuenta en su base de datos o hacer cualquier otra cosa con ella.
También puede configurar una conexión WebSocket entre su cliente y el servidor e intercambiar información de esa manera, pero todo lo que realmente necesita es una simple solicitud HTTP POST.
Basado en la guía de Kelvin, terminé con la siguiente solución:
<script> const ethereumButton = document.querySelector('.enableEthereumButton'); const showAccount = document.querySelector('.showAccount'); ethereumButton.addEventListener('click', () => { getAccount(); }); async function getAccount() { const accounts = await ethereum.request({ method: 'eth_requestAccounts' }); const account = accounts[0]; showAccount.innerHTML = account; console.log(account) const response = await fetch('http://localhost:3000/save_eth_address', { method: 'POST', headers: { 'Content-Type': 'application/json', }, body: JSON.stringify({ eth_address: account, }) }); } </script>Que envía parámetros al controlador que puedo encontrar fácilmente y guardar en la base de datos.