【问题标题】:jquery-ujs apparently handling event but result not visible on pagejquery-ujs 显然处理事件但结果在页面上不可见
【发布时间】:2019-09-16 18:09:40
【问题描述】:

这个块

<div id='travels' class='tableize'>
  <%= render @travels %>
</div>

然后通过_travel.html.erbpartial 为@travels 的每条记录发送以下表单和结果

  <div class='small-2 medium-2 large-2 columns text-right'>
    <%= form_with(model: travel, remote: true, data: {'js-travel-form' => true, method: :patch}, url: restriction_update_travels_path, data: {'js-travel-form' => true}) do |form| %>
      <%= form.hidden_field :id, value: travel.id %>
      <%= form.submit ' Change' %>
    <% end %>
  </div>
  <div class='small-2 medium-2 large-2 columns' data-js-travelstatus=<%= travel.id %>>
    <% if travel.restricted %>
      <%= fa_icon('ban', class: 'fa-lg smaller warning') %>
    <% end %>
  </div>

控制器更新状态并发送出去

@travel = Travel.find(params[:travel][:id])
if @travel.restricted.nil? || !@travel.restricted? 
  @travel.update_attributes(restricted: true)
else
  @travel.update_attributes(restricted: false)
end
if @travel.save
  render partial: 'travelstatus'
end

其中restriction_update.js.erb生成如下js

$("#data-js-travelstatus").replaceWith("<%= j(render @travelstatus)  %>");

通过_travelstatus.html.erb渲染

<% if @travel.restricted %>
  good      <%= fa_icon('ban', class: 'fa-lg smaller warning') %>
<% end %>

浏览器开发工具网络控制台获取操作并作为响应返回

good

但是

  1. 根据 html.erb 部分没有进一步的 html,这很奇怪,因为如果我用 travel 替换 @travel 实例变量,它会返回预期的 rails 错误纸莎草
  2. 并且状态情况没有刷新(无论是真还是假模式)...甚至不是“好”原始字符串。

rails 5.2.4 但调用jquery-ujs

这哪里出了问题?

【问题讨论】:

    标签: javascript jquery ruby-on-rails


    【解决方案1】:

    我认为问题出在这里:

    $("#data-js-travelstatus").replaceWith("<%= j(render @travelstatus)  %>");
    

    JavaScript 找不到节点 #data-js-travestatus,您希望它是 &lt;div class='small-2 medium-2 large-2 columns' data-js-travelstatus=&lt;%= travel.id %&gt;&gt;。但是div 上没有设置id 属性。

    你可以改写成:

    <div class='small-2 medium-2 large-2 columns' id="<%= travel.id %>">
    

    $("#<%= @travel.id %>").replaceWith("<%= j(render @travelstatus)  %>");
    

    更新:我错过了这个:

    您正在渲染travelstatus,这是错误的。你需要渲染restriction_update

    @travel = Travel.find(params[:travel][:id])
    if @travel.restricted.nil? || !@travel.restricted? 
      @travel.update_attributes(restricted: true)
    else
      @travel.update_attributes(restricted: false)
    end
    if @travel.save
      #render partial: 'travelstatus' <- this is wrong
      render partial 'restriction_update'
    end
    

    【讨论】:

    • 那行不通。动作被拾起,浏览器开发网络工具返回相同的“好”字符串...
    • 重命名了部分。只有“字符串”的相同网络工具响应,但浏览器上没有任何可见...
    • 我看到两个问题:第一,响应不完整(仅good)。其次,div 没有被更新。我会先解决后者。那么,是否正在呈现具有预期 id 的 div? restriction_update 中使用的选择器是否在浏览器控制台中工作?您可以在浏览器控制台中手动更新 div 吗?部分是否正在执行(在restriction_update 中添加 byebug 以检查@travel.id@travelstatus)。 @travelstatus 的值是多少,顺便说一句?
    • @travel.id 返回正确答案...但你的预感是正确的,@travelstatus 返回 nil
    • 我猜应该是$("#&lt;%= @travel.id %&gt;").replaceWith("&lt;%= j(render 'travelstatus') %&gt;");,部分的名字。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-26
    • 1970-01-01
    • 2012-09-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多