El SysAdmin del 3er Mundo

todo lo que expliqué mientras nadie prestaba atención

assets por controlador

| Comments

NUNCA, he logrado entender, porque el asset pipeline de Rails carga TODAS las porquerías de todos los controladores en todas las vistas.

¡¡¡Como si fuese poco tener que cargar el mismo javascript por controlador!!!

La documentación dice que puedes cargar solamente el del controlador; pero cuando la sigues al pie de la letra; Rails te da tremendo palo, diciendo que una asset se escapó sin compilar. La “una” suele ser la del controlador que estés cargando, o sea, todas.

La solución que plantea la documentación, es un Proc asqueroso que tampoco pincha.

Te cuento como lo hice:

Primero tienes que quitar la cláusula “require_tree .” del application.js

A mi me quedó así:

application.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
// This is a manifest file that'll be compiled into application.js, which will include all the files
// listed below.
//
// Any JavaScript/Coffee file within this directory, lib/assets/javascripts, vendor/assets/javascripts,
// or any plugin's vendor/assets/javascripts directory can be referenced here using a relative path.
//
// It's not advisable to add code directly here, but if you do, it'll appear at the bottom of the
// compiled file.
//
// Read Sprockets README (https://github.com/rails/sprockets#sprockets-directives) for details
// about supported directives.
//
//= require jquery
//= require jquery_ujs
//= require turbolinks
//  require_tree . fíjate que quitamos el =
Turbolinks.enableProgressBar();

Ahora vamos a dar un toque mágico para que las assets se compilen de manera dinámica, sin tener que colocarle manualmente al arreglo los nuevos .js generados. El fichero config/initializers/assets.rb me quedó así; OJO que es una linea bien larga:

“assets.rb - ojo con la linea larga”
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# Be sure to restart your server when you modify this file.

# Version of your assets, change this if you want to expire all your assets.
Rails.application.config.assets.version = '1.0'

# Add additional assets to the asset load path
# Rails.application.config.assets.paths << Emoji.images_path

# Precompile additional assets.
# application.js, application.css, and all non-JS/CSS in app/assets folder are already added.
# Rails.application.config.assets.precompile += %w( search.js )

# compila todo lo que te encuentres por el camino
Rails.application.config.assets.precompile += Dir.glob(File.join(Rails.root.to_path,'app/assets/javascripts/*.j*')).map{|f| File.basename(f).split('.')[0..1].join('.')}

# activa el debug de la asset pipeline, solo en entorno de desarrollo
Rails.application.config.assets.debug = ENV['RAILS_ENV'] and ENV['RAILS_ENV'].include? 'development'

Podría hacer lo mismo con las CSS si usa un poquito la células grises. Note como además, agregamos que se debugue la asset pipeline si y solo si estamos en development.

Pero no hemos terminado, la vista lleva unos toques… pues debemos decirle lo más importante, que cargue solo las .js de su controlador. A mi me quedó así:

<%= javascript_include_tag params[:controller] %>

“app/views/layouts/application.html.erb”
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<!DOCTYPE html>
<html>
<head>
  <title>El Título</title>
  <%= stylesheet_link_tag    'application', media: 'all', 'data-turbolinks-track' => true %>
  <%= javascript_include_tag 'application', 'data-turbolinks-track' => true %>
  <!-- carga solo las .js del controlador dado -->
  <%= javascript_include_tag params[:controller] %>
  <%= csrf_meta_tags %>
</head>
<body>

<%= yield %>

</body>
</html>

Ahí te das cuenta que el que carga todo, es el manifest (application.js) con su “requiere_tree .” pero la cláusula en la línea 8 le dice que cargue la .js del controlador especificado en params[:controller]

Bueno así debe pinchar con javascript y con CoffeScript, al menos a mi me pinchó con ambos. Veamos que trae rails 5 con esto, porque la mejora urge…

Si la cosa sigue así en la versión 5, me estoy mudando para Volt

Si este artículo te resultó interesante, considere donar 0.08 BTC: 1Kg4gu3e7u8HUw8bj5NbBciRg6Y56kuFCU

Comments