2011-09-15 12 views
21

Para mantener la lógica de JavaScript específica del controlador fuera de la norma application.js y solo la tiene incluida el controlador relevante, la incluyo en su propio archivo .js que incluye se basa en el nombre del controlador de la disposición, como por ejemplo:Estrategia de Rails 3.1 para precompilar activos JS específicos del controlador

<%= javascript_include_tag "application", params[:controller] %> 

que funciona muy bien, pero cuando puedo implementar la aplicación a la producción (estoy usando Capistrano y tener un pre-compile operativos creados), la la canalización de activos no precompila ninguno de los archivos JS específicos del controlador. Supongo que esto se debe a que las directivas require no hacen referencia a mi archivo JavaScript real en application.js.

¿Cómo me ocupo de esto sin mover mi JS específico de controlador de nuevo a application.js, o hacer referencia explícitamente desde application.js?

¿Hay alguna forma de decirle a la canalización de activos que compile previamente una lista adicional de archivos? ¿Cómo podría precompilar manualmente un archivo específico en producción?

actualización

Como turns out, puede especificar archivos individuales aquí en su config/environments/production.rb:

config.assets.precompile += %w(achievements.js) 

... o simplemente me fui por delante y caprichosamente añadido que para cada archivo JavaScript:

config.assets.precompile += %w(*.js) 
+2

¡esto debería ser realmente automático! –

+3

¡Vale la pena señalar aquí que agregar archivos scss/coffee a la lista precompilada NO FUNCIONARÁ! (¡Y no arrojar ningún error tampoco!). Debe nombrar solo con la extensión .js/css. –

Respuesta

4

Esto es lo que hago:

estructura

directorio:

app/assets/javascripts/sessions/multiple.js 
app/assets/application-sessions.js 

aplicación sessions.js simplemente tiene:

*= require_self 
*= require_tree ./sessions 

Luego, en su opinión, hacer

<% if @current_controller == 'whatever' %> 
    <%= javascript_include_tag "application-sessions" %> 
<% else %> 
    …. 
<% end %> 

FYI, @current_controller = controller_name en mi application_controller .rb métodos, llamados con un before_filter.

+0

Parece una solución, aunque un poco más compleja de lo que terminé haciendo en mi actualización. Espero que no haya efectos secundarios no deseados en mi solución. –

+0

Creo que tu camino está bien. El que enumeré le permitirá incluir solo los archivos js que desee dependiendo del "área" de su código. De esta forma, no estás cargando más de lo necesario. – jschorr

5

Creo que usted y james_schorr realmente no están hablando de lo mismo. Debe agregar los archivos que no sean application.js a config.assets.precompile. Su respuesta fue más acerca de la estructura de directorios que podría/debería adoptar, si no me equivoco.

Si quería tener controlador específico, lo haría:

/assets 
    /javascripts 
     /users 
      login.js 
      profile.js 
     /blogs 
     /posts 
     users.js 
     blogs.js 
     posts.js 

y, por ejemplo, users.js sería:

*= require_tree ./users 

De esa manera, puede mantenerse organizado (tienen una gran cantidad de js archivos por controlador), pero en prod, se incluirán todos en un archivo.

Todavía necesita que en su configuración:

config.assets.precompile += %w(*.js) 
0

Tengo mismo problema aquí, es un dolor de cabeza para mí.

Incluir * .js es un poco demasiado, no quiero que todos los archivos se compilen en archivos separados, algunos de ellos deben fusionarse.

Mi idea es almacenar los archivos específicos del controlador en un subdirectorio, como "controladores", y luego solo incluir controladores/*. Js o archivos css para precompilar.

No estoy seguro de si funciona o no, lo voy a probar, de todos modos, podría ser una pista útil.

7

Si desea precompilar el js | css sólo se encuentra en la raíz de activos/javascript y activos/hojas de estilo directorios (y no su jerarquía de árbol), se puede poner esto en los archivos de entorno:

Dir.chdir "#{Rails.root}/app/assets/javascripts" 
    a = Dir.glob("*.{js,coffee,erb}") 
    Dir.chdir "#{Rails.root}/app/assets/stylesheets" 
    b = Dir.glob("*.{css,erb}") 
    config.assets.precompile += a.concat(b) 
    Dir.chdir Rails.root 
Cuestiones relacionadas