Rails ujs调用类的子集

时间:2019-05-11 10:32:59

标签: ruby-on-rails ajax turbolinks rails-ujs

Usercontent类的记录是通过带有Turbolink的AJAX调用生成和显示的,除了在rails 5应用程序中调用jQuery3之外,基本上是rails方式。

但是,存在两种渲染用例,一种用于类的所有对象(usercontent,另一种用于子集(point),在同一页面上,但在选项卡中,具有两种不同的形式以及以下usercontents.js javascript。

$(document).on('turbolinks:load', function() {
  $('[data-js-usercontent-form]').on("ajax:success", function(event, data, status, xhr){
    var usercontent = $(xhr.responseText).hide();
    $('#usercontents').append(usercontent);
    usercontent.fadeIn(1000);
  });

  $('[data-js-usercontent-id]').on("ajax:success", function(event, data, status, xhr){
    var usercontent_id = xhr.responseJSON.id;
    $('[data-js-usercontent-id=' + usercontent_id + ']').hide();
  });
  $('[data-js-point-form]').on("ajax:success", function(event, data, status, xhr){
    var point = $(xhr.responseText).hide();
    $('#points').append(point);
    point.fadeIn(1000);
  });    

  $('[data-js-point-id]').on("ajax:success", function(event, data, status, xhr){
    var point_id = xhr.responseJSON.id;
    $('[data-js-point-id=' + point_id + ']').hide();
  });
});

控制器声明两个集合

@usercontents = Usercontent.all
@points = Usercontent.where(['contenttype_id = ?', 1]).all

该视图对集合有两个不同的调用

<div id=points class='tableize'>
  <%= render @points %>

<div id=usercontents class='tableize'>
  <%= render @usercontents %>

谁又通过AJAX _point.html.erb调用要更新的单个项(两个部分都在views / usercontents目录中)

<div class='row' data-js-point-id=<%= point.id %>>

_usercontent.html.erb

<div class='row' data-js-usercontent-id=<%= usercontent.id %>>

问题在于前者使用错误的data-js调用来呈现“完整”集合:

<div id="points" class="tableize">
  <div class="row" data-js-usercontent-id="33"></div>
  <div class="row" data-js-usercontent-id="34"></div>
  <div class="row" data-js-usercontent-id="35"></div>
  <div class="row" data-js-usercontent-id="36"></div>
  <div class="row" data-js-usercontent-id="37"></div>
  <div class="row" data-js-usercontent-id="38"></div>
  <div class="row" data-js-usercontent-id="39"></div>
  <div class="row" data-js-usercontent-id="48"></div>
</div>

很显然render @points无法正确呈现。如何解决?

1 个答案:

答案 0 :(得分:1)

您的问题是因为:

  

Rails通过查看来确定要使用的部分名称   集合中的模型名称。
  (source

这意味着您的部分_point.html.erb从未使用过。

@points集合在_usercontent.html.erb内呈现,因为它包含Usercontent条记录。

要解决您的问题,请通过指向正确的上下文来呈现部分内容:

<div id=points class='tableize'>
  <%= render partial: "point", collection: @points %>