我有以下代码:
/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>
为什么这不起作用?
答案 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"))