ruby on rails - rails - ¿Cómo debo incluir un archivo de coffeescript en una sola página?
ruby and rails documentation (2)
Aquí está el enfoque que utilizo para hacer que el controlador / vista de café específico:
application.html.haml:
%body{ :data => { :controller => params[:controller], :action => params[:action]} }
alt. aplicacion.html.erb
<%= content_tag(:body, :data => { :controller => params[:controller], :action => params[:action] }) do %>
...
<% end %>
aplicacion.js.coffee:
$(document).ready ->
load_javascript($("body").data(''controller''),$("body").data(''action''))
load_javascript = (controller,action) ->
$.event.trigger "#{controller}.load"
$.event.trigger "#{action}_#{controller}.load"
usuarios.js.coffee
$(document).bind ''edit_users.load'', (e,obj) =>
# fire on edit users controller action
$(document).bind ''show_users.load'', (e,obj) =>
# fire on show users controller action
$(document).bind ''users.load'', (e,obj) =>
# fire on all users controller actions
Nota al margen:
Esto funciona muy bien con PJAX, así como puede pasar los nombres de controlador / acción con el encabezado de respuesta en las solicitudes de PJAX y simplemente disparar estas funciones js basadas en eso.
EDITAR (2014/03/04): esta solución aún funciona cuando se utiliza turbolinks.js .
Edición: un año más tarde, si volviera a hacer esto, lo haría con curl.js en lugar del canal de activos de Rails.
Relacionado: ¿La mejor manera de agregar javascript específico de página en una aplicación de Rails 3?
Estoy escribiendo una aplicación y usando coffeescript para generar todos los js. Es por eso que la pregunta relacionada no hace lo que necesito.
Me gustaría poder colocar un archivo de coffeescript en una subcarpeta de mi directorio de activos y tener ese archivo .coffee solo en una página. La página está en una ruta con nombre
match ''myNotifications'' => ''user#notifications''
Lo más obvio fue poner el archivo .coffee en los assets/javascripts/user/index.js.coffee
. Pero después de leer los documentos sobre activos no estoy claro.
Leí esta línea (de http://guides.rubyonrails.org/asset_pipeline.html ):
Debe colocar cualquier JavaScript o CSS exclusivo para un controlador dentro de sus respectivos archivos de activos, ya que estos archivos pueden cargarse solo para estos controladores con líneas como <% = javascript_include_tag params [: controller]%> o <% = stylesheet_link_tag params [ : controlador]%>.
Ok, genial, así que puse la página específica js en los assets/javascripts/user.js.coffee
Luego recargué mi página de inicio, Ctrl F5. El archivo user.js todavía se está cargando en la página de inicio. Probado con $ -> alert ''ready from users controller''
; Al ver esa alerta cuando se carga la página de inicio.
¿Rails tiene una forma de tener un archivo de coffeescript por página que solo se publicará con esa página? ¿Estoy leyendo el manual mal? ¿Hay algún lugar en la carpeta de activos donde pueda colocar archivos .coffee donde no se carguen con cada página?
Actualización : Parece que podría tener una respuesta :
Hay un par de maneras en que podemos solucionar este problema. Podríamos usar require_directory en lugar de require_tree ya que esto solo cargará los archivos en el directorio actual y no en los subdirectorios. Si queremos más control sobre los archivos incluidos, podemos solicitarlos por separado en lugar de incluir todo el directorio. Alternativamente, podríamos mover los archivos JavaScript que queremos que se incluyan en todas las páginas a un subdirectorio público. Luego podemos usar require_tree ./public para incluir solo esos archivos.
Voy a darle una oportunidad en la mañana.
En lugar de solo incluir el archivo en una página, es posible que desee utilizar solo la lógica que es condicional en el marcado de la página. Ver mi respuesta a una pregunta relacionada . De esa manera, sus usuarios no tienen que realizar una solicitud <script>
adicional para la página en particular.
Si hay mucha lógica específica para esa página (por ejemplo, 10K + minified), entonces sí, divídalo. Como sugirió en la edición de su pregunta: En lugar de hacer require_tree .
en la raíz de su directorio javascripts
, cree un subdirectorio llamado global
y cambie la parte superior de application.js
desde
require_tree .
a
require_tree global
Luego, coloque el archivo CoffeeScript específico de la página en el directorio raíz javascripts
y señálelo con una llamada javascript_include_tag
en la plantilla de esa página.