js.erb 不在 Rails 6 中渲染

Posted

技术标签:

【中文标题】js.erb 不在 Rails 6 中渲染【英文标题】:js.erb not rendering in rails 6 【发布时间】:2021-03-21 05:21:14 【问题描述】:

我在从动作渲染 .js.erb 时遇到问题。动作触发,rails 告诉我它正在渲染 js.erb,但 js 从未被渲染,并且从控制台日志中可以明显看出 js 没有渲染到浏览器的控制台。我在网上尝试了一堆解决方案,但似乎无法找出为什么 rails 会告诉我这个 js 模板正在渲染,但实际上并没有在浏览器中渲染。 我可能会错过什么?

控制器动作

def dynamic_search
    puts "WE ARE IN DYNAMIC_SEARCH"
    puts params[:q]
    client = HTTPClient.new
    string = 'call to google places api'
    @result = client.get_content(string)
    @hash = JSON.parse @result

    render "home/dynamic_search.js.erb", format: :js
  end

Rails 终端输出

  Rendering home/dynamic_search.js.erb
  Rendered home/dynamic_search.js.erb (Duration: 0.0ms | Allocations: 4)
Completed 200 OK in 479ms (Views: 0.7ms | ActiveRecord: 0.0ms | Allocations: 4613)

更新:

调用该操作的代码如下(不是 100% 正确,目前只是使用 JQuery 轻松自动完成测试调用)

document.addEventListener("turbolinks:load", function() 

    $input = $('*[data-behavior="autocomplete"]')

    var options = 
        url: function(phrase)
            console.log(phrase)
            return '/search/' + phrase
        
    

    $input.easyAutocomplete(options);
);

【问题讨论】:

你能分享dynamic_search.js.erb的代码吗?没有任何错误或任何东西只是呈现一个空白页面?您能否也提供一个您尝试过但不起作用的示例 URL? 你是怎么进入这个页面的? dynamic_search 听起来这可能是一个您没有处理的 AJAX 调用。 Rails 显然正在呈现该页面,因此我们将需要更多详细信息来确定您的问题所在。 我在这里与贡献者合作:你能分享来自 dynamic_search.js.erb 的代码吗?它只包含一个console.log('here')。这是在从 jquery 触发的 Rails 中命中操作后呈现的。页面已加载,jquery 命中动作,动作在 rails 中呈现并期望呈现 dynamic_search.js.erb(并且 rails 报告它呈现它)。但是 javascript 从未接触过浏览器。事实上,我们无法通过 chrome 检查器在源中找到 dynamic_search.js.erb @jamesdlivesinatree 您实际上是在访问“/some/path/dynamic_search.js”还是从另一个页面加载的。如果另一个页面,请发布代码显示它是如何被加载的。 它正在从另一个页面加载。请参阅更新的说明。 1.用户登陆页面,将jquery脚本加载到/search/x。 2. Rails 将/search/x 路由到dynamic_search。 3 dynamic_search 呈现dynamic_search.js.erb(它有一个控制台日志和一个alert()),但在前端从未看到控制台日志或警报(仔细检查浏览器日志过滤器等)。 【参考方案1】:

easy-autocomplete 期望 dynamic_search 返回可解析的数据(JSON 或 XML)。

它实际上并没有在当前上下文中运行“dynamic_search.js.erb”中的js。这意味着“dynamic_search.js.erb”的内容需要在渲染后表示这样的对象,或者最好是 dynamic_search 操作应该直接渲染它。

例如(我假设您想将easy-autocomplete@result 一起使用)

def dynamic_search
    puts "WE ARE IN DYNAMIC_SEARCH"
    puts params[:q]
    client = HTTPClient.new
    string = 'call to google places api'
    @result = client.get_content(string)

    render json: @result
  end

我不确定 @result json 的实际外观,因此您可能需要在上方或下方进行额外操作。

那么js可以是:

document.addEventListener("turbolinks:load", function() 
    $input = $('*[data-behavior="autocomplete"]')
    var options = 
        url: function(phrase)
            console.log(phrase)
            return `/search/$phrase`
        
    
    $input.easyAutocomplete(options);
);

【讨论】:

这几乎行得通! json 确实按预期呈现,但模板 (dynamic_search.js.erb) 没有呈现(rails 输出也没有告诉我们模板已被呈现。我们如何告诉它在def dynamic_search 操作中也呈现dynamic_search.js.erb 仔细观察问题,我们确切地知道这里发生了什么:***.com/questions/37437247/rails-js-erb-not-working。难道是我们需要在表单提交中表示一些:remote => true,而不是通过/search/ + phrase调用动作? 您希望“渲染”什么? easyAutocomplete 的 url 只是为$input 提供数据,它根本不打算更改页面的内容,而不是自动完成列表 FWIW,这里的问题是:remote => true。 Rails 表单要求 jquery 在表单提交时工作。

以上是关于js.erb 不在 Rails 6 中渲染的主要内容,如果未能解决你的问题,请参考以下文章

在 rails create controller (Rails 6) 中渲染 new.js.erb

Rails 6:Ajax 不接受 js.erb 中的渲染

Rails:从另一个控制器渲染 .js.erb?

rails js.erb 没有被渲染

在 js.erb 中渲染 Rails 部分而不重新加载整个页面

如何渲染与 Rails 中的成员操作同名的 js.erb?