【问题标题】:rails ujs call on subset of classrails ujs调用类的子集
【发布时间】:2019-09-29 01:31:09
【问题描述】:

Usercontent 类通过 AJAX 调用使用 turbolinks 生成和显示记录,基本上是 rails 方式,除了在 r​​ails 5 应用程序中调用 jQuery3。

但是有两种呈现情况,一种用于类的所有对象 (usercontent),另一种用于子集 (point),在同一页面上,但在选项卡中,具有两种不同的形式和以下 @ 987654324@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 没有正确渲染。如何解决这个问题?

【问题讨论】:

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


    【解决方案1】:

    你的问题是因为:

    Rails 通过查看 集合中的模型名称。
    (source)

    这意味着您的部分_point.html.erb 永远不会被使用。

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

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

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

    【讨论】:

    • 我对此有所了解,但有时轨道魔法很难理解。可以很容易地假设 rails 将采用已声明集合的单数形式......在您的回复中,有一个问题我仍然不清楚。这实质上是说 redner @points 带有部分点的集合。但是,该部分应该是一系列行,而 &lt;div class='row' data-js-point-id=&lt;%= point.id %&gt;&gt; 在被正确识别方面存在问题(point实际上无法识别)
    • 是的,现在调用了部分,但是当尝试调用成员 &lt;div class='row' data-js-point-id=&lt;%= point.id %&gt;&gt; 时,部分上的 #undefined local variable or method point'。与&lt;%= render "point", collection: @points, as: :point %&gt; 相同的错误
    • @Jerome 是的,这是我的错误,您需要添加密钥 :partial。我更新了我的答案。
    • 而且相当笨拙,当它盯着我看时,我错过了指南中的那个......
    • 然而……这最终是重言式的。根据定义调用render 调用部分......这是一个陷阱......
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-10
    • 2018-10-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多