【问题标题】:Error using erb in js.coffee files in the rails asset pipeline在 rails 资产管道中的 js.coffee 文件中使用 erb 时出错
【发布时间】:2013-11-19 21:47:44
【问题描述】:

我有以下代码:

/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("&lt;%= asset_path('rails.png') %&gt;") 的控制台输出是/assets/rails.png,这是我所期望的。但是,每当我包含 console.log("&lt;%= link_to 'Sign up now!', '#' %&gt;") 时,页面加载时都会出现错误:

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

为什么这不起作用?

【问题讨论】:

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


    【解决方案1】:

    问题

    原因是资产 pineline 背后的宝石 Sprockets 不依赖 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"))
    

    【讨论】:

    • 谢谢!我实际上需要比 link_to 更复杂的东西,但是我遇到了同样的错误,所以我在示例中使用了 link_to,因为它更简单。我需要使用从模型中填充的 collection_select 助手,有什么建议吗?再次感谢
    • 看来您要在资产中混合一些数据,我个人不喜欢这种做法。我建议你考虑使用 Ajax 来拉取 js 或 JSON。
    • 与资产不同,在 JS 响应中,您可以在 app/views 中使用 js.erb 中的任何助手
    猜你喜欢
    • 2011-12-14
    • 1970-01-01
    • 1970-01-01
    • 2018-09-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-27
    • 1970-01-01
    相关资源
    最近更新 更多