@drawoharai ❤️ this! << haga clic aquí 🐛 🫖 🧚
/non-icky-javascript-helper-ap-is-on-your-rails-controllers
publicado el: 2013-06-10

ref: https://gist.github.com/ahoward/5752290

las aplicaciones web casi siempre terminan necesitando una plétora de pequeños métodos auxiliares de javascript: ya sabes, formularios de autocompletado, poblar valores predeterminados, validaciones, etc. estos no son llamadas a la API propiamente dichas, solo pequeños fragmentos de funcionalidad necesarios para que las vistas funcionen.

siempre hay una pregunta sobre qué controlador colgar estos métodos. ¿haces un controlador de ayuda global para todo esto? ¿los cuelgas del controlador en cuestión? ¿cómo compartir el backend de métodos auxiliares de javascript entre controladores?

paso uno

incluir el módulo RPC en tu ApplicationController

  class ApplicationController < ::ActionController::Base
    include RPC
  end

paso dos

en los controladores, declara los métodos auxiliares rpc

  class PostsController < ApplicationController
    rpc(:defaults) do |params|
      post = Post.new(params)
      post.set_defaults!
      post.as_json
    end
  end

paso tres

configura js para poder llamar a los métodos rpc relativos al controlador actual

  // in file: app/views/layouts/application.html.erb
  //
  // notice the *relative* url rpc endpoint
  //
  // <script>
  
    jQuery(function(){
        var rpc = function(){
        // parse args
        //
          var args = Array.prototype.slice.call(arguments);
          var ajax;
          var method;
          if(args.length == 1 && typeof(args[0]) == 'object'){
            ajax = args.shift();
          } else {
            ajax = {};
            for(var i = 0; i < args.length; i++){
              var arg = args[i];
              switch (typeof(arg)) {
                case 'object':
                  ajax['data'] = arg;
                  break;
                case 'function':
                  ajax['success'] = arg;
                  break;
                case 'string':
                  method = arg;
                  break;
              };
            }
          };
          // normalize ajax options
        //
          ajax['url']