convertir coffee jquery ruby-on-rails ruby coffeescript erb

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"))