【问题标题】:Rails is rendering an empty partial from js.erbRails 正在从 js.erb 渲染一个空的部分
【发布时间】:2020-01-02 20:40:48
【问题描述】:

我正在尝试渲染 js.erb 文件的部分内容,但视图中没有显示任何内容。

当按下按钮时,有一个 AJAX 调用会触发announcements_controller 中的report_announcement 操作。

reports.js

$.ajax({
  type: "POST",
  contentType: "application/json",
  url: "/announcements/report_announcement.js",
  data: json_data
});  

报告/_report_content.html.erb

<div id="report_announcements_container"></div>

announcements_controller.rb

  def report_announcement
    @announcement = Announcement.new(announcement_params)

    respond_to do |format|
      if @announcement.save
        format.js {}
      end
    end   
  end

announcements/report_announcement.js.erb

我知道announcements/report_announcement.js.erb 呈现正常,因为我可以在控制台和development.log 中看到日志记录语句,以及正在记录到控制台的report_announcement 对象。

<% announcement_json = @announcement.to_json.html_safe %>
var report_announcement = <%= announcement_json %>;
console.log('report_announcement');
console.log(report_announcement);

// this is where something is not right I think 
$("#report_announcements_container").html("<%= escape_javascript(render partial: 'announcements/report_announcements', locals: { announcement: @announcement }) %>");
console.log('inside announcements....');

announcements/report_announcements.html.erb 这是我遇到问题的地方,因为显示了部分的日志记录语句,但是页面上没有显示部分的任何内容。我在 development.log 中看到页面呈现,但视图中实际上没有显示任何内容。部分未显示在 report_announcements_container div 的页面上。

<h1>test</h1>
<%= announcement %>
<script>
  console.log('inside partial...');
</script>

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-4


    【解决方案1】:

    您在 ajax 调用中使用了错误的内容类型。 Rails 将application/javascripttext/javascript 识别为:js 格式。

    此外,当您请求 js 格式时,您实际上必须执行返回的 javascript 才能在客户端中发生任何事情。

    $.ajax({
      type: "POST",
      contentType: "application/javascript",
      url: "/announcements/report_announcement.js",
      data: json_data
    }).done(function(data){
      jQuery.globalEval(data); // Yeah eval is evil. 
    });
    

    如果您在此之前进行过任何“真正的”ajax 调用,那么这看起来会完全倒退——因为确实如此。 js.erb 是一个糟糕的 mans ajax 框架,适用于 javascript 受损者,它由一堆路由和视图组成,这些路由和视图会改变客户端中的 DOM。

    手动创建对 js.erb 模板的调用只是 masocism 中的一项愚蠢的练习。如果您真的想使用它,请创建一个表单并使用它发送请求,以便您可以利用 rails 提供的 javascript 处理程序:

    <%= form_with(url: "/announcements/report_announcement", remote: true) do |f| %>
      # ...
    <% end %>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-11
      • 2014-05-28
      • 2016-12-30
      • 1970-01-01
      • 1970-01-01
      • 2012-07-29
      • 1970-01-01
      • 2021-03-21
      相关资源
      最近更新 更多