jquery - coffee - js to coff
Error al usar erb en archivos js.coffee en la canalizaciĆ³n de activos de rieles (1)
Tengo el siguiente código:
/assets/javascripts/home.js.coffee.erb
jQuery ->
addClickListeners = ->
$(document).on ''click'', ''#add-chord-link'', addChord
$(document).on ''click'', ''#remove-chord-link'', removeChord
addChord = (e) ->
e.preventDefault()
console.log("<%= asset_path(''rails.png'') %>")
console.log("<%= link_to ''Sign up now!'', ''#'' %>")
console.log(''addChord clicked'')
$(''#chord-choices'').append(''addedChord'')
removeChord = (e) ->
e.preventDefault()
$(''#chord-choices select'').last().remove()
console.log(''removeChord clicked'')
addClickListeners()
La salida de la console.log("<%= asset_path(''rails.png'') %>")
para console.log("<%= asset_path(''rails.png'') %>")
es /assets/rails.png
, que es lo que espero. Sin embargo, cada vez que console.log("<%= link_to ''Sign up now!'', ''#'' %>")
Aparece un mensaje de error al cargar la página que dice:
undefined method `link_to'' for #<#<Class:0x007f9095960938>:0x007f9095b78ab8>
¿Por qué esto no funciona?
El problema
La razón es Sprockets, la gema detrás de Assets pineline, no depende de Rails para procesar erb. Ver los ayudantes nativos disponibles https://github.com/sstephenson/sprockets#invoking-ruby-with-erb
Rails agregó más ayudantes a Assets Pineline en ActiveSupport, son todo lo que puedes usar. Puede encontrarlos aquí: http://api.rubyonrails.org/classes/ActionView/Helpers/AssetUrlHelper.html
link_to
es un helper perteneciente a ActionView, por lo que no está incluido en Assets Pineline.
Los hacks
Existen algunas soluciones que le permiten usar los ayudantes de ActionView dentro de Assets Pineline:
Dirige a los ayudantes en la cartera de activos
https://github.com/sstephenson/sprockets/issues/218
¿Cómo incluir a los ayudantes de ActionView en la cartera de activos?
Mis sugerencias
Si todo lo que necesita es el enlace en cuestión o un poco más, no necesita el problema para hackear. Use texto sin formato o una ayuda de Javascript. Eso es suficiente.
//plain text
"<a href=''#''>Sign up</a>"
//JS helper
Link = {}
Link.sign_up = "<a href=''#''>Sign up</a>"
Link.link_to = (url, anchor) ->
"<a href=/"#{url}/">#{anchor}</a>"
console.log(Link.sign_up)
console.log(Link.link_to("#", "Sign up"))