javascript - 预编译时未找到 javascript 资源中的路由辅助方法

标签 javascript ruby-on-rails ruby asset-pipeline

我正在开发一个 Rails 项目,其中包含依赖于路由帮助器方法的 javascript 资源。

在我的 .js.erb 中,我从以下内容开始:

 <% environment.context_class.instance_eval { include Rails.application.routes.url_helpers } %>

然后编写 JavaScript 本身:

  jQuery("#search_keyword")
  .bind("keydown", function(event) {
        if(event.keyCode === jQuery.ui.keyCode.TAB &&
           jQuery(this).data("ui-autocomplete").menu.active) {
                   event.preventDefault();
            }
  })
  .autocomplete({
        source: function (request, response) {
                jQuery.getJSON ( '<%= search_complete_belongings_path(:json) %>', {
                             term: extractLast (request.term)
                          }, response);
        },
        search: function() {
                var term = extractLast (this.value);
                if (term.length < 2) {
                   return false;
                }
        },
        focus: function(event, ui) {
            return false;
        },
        select: function(event, ui) {
            var terms = split (this.value);
            terms.pop(),
            terms.push(ui.item.belonging.name);
            this.value=terms;
            return false;
        }
    })
    .data( "ui-autocomplete" )._renderItem = function( ul, item ) {
        return $( "<li>" )
            .data( "item.autocomplete", item.belonging )
            .append( "<a>" + item.belonging.name + "</a>" )
            .appendTo( ul );
    };

此函数依赖于 jquery-ui 的自动完成功能,并对以下路由进行 ajax 调用:

<%= search_complete_belongings_path(:json) %>

代码在开发中运行良好,但是一旦我执行了assets:precompile,我收到以下错误:

   NoMethodError: undefined method `search_complete_belongings_path' for #<#<Class:0x0000000279df18>:0x00000003813730>
   (in /tmp/build_d1c6dfa1-0995-4df1-9abe-74874ab13cb0/app/assets/javascripts/belonging.js.erb)
   /tmp/build_d1c6dfa1-0995-4df1-9abe-74874ab13cb0/app/assets/javascripts/belonging.js.erb:82:in `block in singletonclass'
   /tmp/build_d1c6dfa1-0995-4df1-9abe-74874ab13cb0/app/assets/javascripts/belonging.js.erb:65531:in `instance_eval'
   /tmp/build_d1c6dfa1-0995-4df1-9abe-74874ab13cb0/app/assets/javascripts/belonging.js.erb:65531:in `singletonclass'
   /tmp/build_d1c6dfa1-0995-4df1-9abe-74874ab13cb0/app/assets/javascripts/belonging.js.erb:65529:in `__tilt_4820660'
   /tmp/build_d1c6dfa1-0995-4df1-9abe-74874ab13cb0/vendor/bundle/ruby/1.9.1/gems/tilt-1.4.1/lib/tilt/template.rb:170:in `call'
   /tmp/build_d1c6dfa1-0995-4df1-9abe-74874ab13cb0/vendor/bundle/ruby/1.9.1/gems/tilt-1.4.1/lib/tilt/template.rb:170:in `evaluate'
   /tmp/build_d1c6dfa1-0995-4df1-9abe-74874ab13cb0/vendor/bundle/ruby/1.9.1/gems/tilt-1.4.1/lib/tilt/template.rb:103:in `render'
   /tmp/build_d1c6dfa1-0995-4df1-9abe-74874ab13cb0/vendor/bundle/ruby/1.9.1/gems/sprockets-2.2.2/lib/sprockets/context.rb:193:in `block in evaluate'
   /tmp/build_d1c6dfa1-0995-4df1-9abe-74874ab13cb0/vendor/bundle/ruby/1.9.1/gems/sprockets-2.2.2/lib/sprockets/context.rb:190:in `each'
   /tmp/build_d1c6dfa1-0995-4df1-9abe-74874ab13cb0/vendor/bundle/ruby/1.9.1/gems/sprockets-2.2.2/lib/sprockets/context.rb:190:in `evaluate'
   /tmp/build_d1c6dfa1-0995-4df1-9abe-74874ab13cb0/vendor/bundle/ruby/1.9.1/gems/sprockets-2.2.2/lib/sprockets/processed_asset.rb:12:in `initialize'

不知道它从哪里来?

谢谢!

最佳答案

您不能使用帮助程序,例如 app/assets 中的 search_complete_belongings_path,因为它们是动态的并且仅在 Rails View 中工作。另一方面,您的资源是静态的并预编译一次

关于javascript - 预编译时未找到 javascript 资源中的路由辅助方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23070921/

相关文章:

javascript - 在具有不同内容(大小)的相同类型的多个元素上运行 jQuery 脚本

ruby-on-rails - 设置设备管理员角色

javascript - Rails ActionController::Live - 立即发送所有内容而不是异步发送

ruby - 所有单例方法都是公开的吗?

ruby gem : writing tests for api wrapper

python - 词法分析和解析实用程序

javascript - Array.find() 获得正确的值但返回错误的值

javascript - 从 lQuery ajax 请求获取进度条的部分响应?

java - 选择后的 Spring MVC 细化下拉列表

mysql - Rails ActiveRecord 两次加入同一个表