He creado un nuevo controlador, que en el futuro será responsable solo de traducir cadenas para diferentes objetos. Aquí está el código del controlador:
# frozen_string_literal: true class Api::TranslationsController < AuthenticatedController def translate_string @translated_string = GoogleTranslator.translate('hello', 'de') render json: {translated_string: @translated_string.to_json} end helper_method :translate_string private def translations_params params.permit( :id, :translated_string ) end endSe ubica en el directorio controllers/api/translations_controller. Aquí está la parte de las rutas:
namespace :api do resource :translations do member do get 'translate_string' end end endY aquí está parte de mi html.erb para llamar a la función JS:
<%= image_tag "google-icon.png", id: "google_icon", onclick: "test_transl()", remote: true%>Y aquí está mi código JS, actualmente solo con Ajax:
<script> function test_transl(){ $.ajax({ type: "GET", url: "/api/translations/translate_string", dataType: "json", success:function (result){ console.log(result) } }) } </script>Espero que este código ajax traduzca el mundo 'hola' al alemán y obtenga el valor @translated_string - 'hola' en la consola, pero no pasa nada excepto el hecho de que el error que obtuve es 'statusText: "parsererror"'. ¿Qué puede estar mal?
Finalmente encontré lo que estaba mal con mi código. El problema fue el hecho de que no pasé el token de sesiones en ajax. Así que ahora mi código ajax se verá así:
$.ajax({ type: "GET", headers: { "Authorization": "Bearer " + window.sessionToken }, url: "/api/translations/translate_string", dataType: "json", success: function(result){ console.log(result); }, error: function (result){ console.log(result, this.error) } })Y definitivamente del controlador así:
def translate_string @translated_string = GoogleTranslator.translate('hello', 'de') render json: @translated_string.to_json endLa salida en la consola es: "hola".