在rails资产管道中的js.coffee文件中使用erb时出错

时间:2013-11-08 00:45:51

标签: jquery ruby-on-rails ruby coffeescript erb

我有以下代码:

/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()

console.log("<%= asset_path('rails.png') %>")的控制台输出为/assets/rails.png,这正是我所期望的。但是,每当我加载console.log("<%= link_to 'Sign up now!', '#' %>")时,我在页面加载时收到错误说明:

    undefined method `link_to' for #<#<Class:0x007f9095960938>:0x007f9095b78ab8>

为什么这不起作用?

1 个答案:

答案 0 :(得分:4)

问题

原因是Sprockets,它是Assets pineline背后的宝石,不依赖于Rails来处理erb。 查看可用的原生助手https://github.com/sstephenson/sprockets#invoking-ruby-with-erb

Rails在ActiveSupport的Assets Pineline中添加了更多帮助程序,它们都可以使用。您可以在此处找到它们:http://api.rubyonrails.org/classes/ActionView/Helpers/AssetUrlHelper.html

link_to是属于ActionView的助手,因此它不包含在Assets Pineline中。

黑客攻击

有一些解决方案允许您在Assets Pineline中使用ActionView助手:

Route helpers in asset pipeline

https://github.com/sstephenson/sprockets/issues/218

How to include ActionView helpers in the assets pipeline?

我的建议

如果您需要的只是相关链接或更多一点,那就不需要麻烦了。使用纯文本或Javascript助手。这就够了。

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