【问题标题】:Rails 5: render partial in another partial with AJAXRails 5:使用 AJAX 在另一个部分中渲染部分
【发布时间】:2017-05-03 01:29:28
【问题描述】:

我在尝试实现 AJAX 时有点卡住了,其中呈现了“link_to”视图,在该视图中我有另一个 AJAX 调用。

我有菜单侧边栏,里面有这样的东西:

<li class="<%= is_active_action('positions') %>"><%= link_to "Positions", positions_path, remote: true %></li>

application.html.erb 我有这个:

<!-- Main view  -->
<div id="yield">
   <%= yield %>
</div>

实际上不确定这是否是正确的做法,但到​​目前为止它确实有效。

然后在 views/../positions/index.js.coffee 我有这个

$("#yield").empty()
  .append("<%= escape_javascript(render 'inventory/positions/index') %>")

这是重新渲染 /positions/_index.html.erb 部分。在那里我有&lt;div id="media_list"&gt;&lt;div id='positions_table'&gt;

在 assets/javascripts 我有 positions.coffee

$ ->
$(document).on 'change', '#media_list', (evt) ->
    $.ajax 'update_positions',
      type: 'GET'
      dataType: 'script'
      data: {
        media_id: $("#media_list option:selected").val()
      }
      error: (jqXHR, textStatus, errorThrown) ->
        console.log("AJAX Error: #{textStatus}")
      success: (data, textStatus, jqXHR) ->
        console.log("Dynamic media select OK!")

这基本上是监听下拉变化,然后将media_id 传递给控制器​​,然后这个 /views/../positions/update_positions.js.coffee 呈现第二部分(/views/ ../positions/_positions.html.erb):

$("#positions_table").empty()
  .append("<%= escape_javascript(render 'inventory/positions/positions', locals: {positions: @positions}) %>")

目前在更改下拉列表时,我无法进行第二部分 (_positions.html.erb) 渲染。 有什么想法可能有问题吗?感谢您的帮助。

更新

我在我的路线中设置了这个: get '/update_positions', to: 'inventory/positions#update_positions' 然后在控制器中我有这个:

def update_positions
  @positions = Positions::Positions.where('media_id = ?', params[:media_id])

:media_id 被传递时,我在控制台Started GET "/update_positions?media_id=1" 中得到了这个结果,视觉上的结果与预期的一样。但是当我连续执行几个类似的请求时,就会发生奇怪的事情。看起来请求正在成倍增加,并且似乎有很多历史请求一次又一次地重复。我的假设是因为这个/update_positions?media_id=1 请帮忙,我做错了什么?

更新 2

首先,我调整了到实际控制器的路线: get '/inventory/positions/update_positions', to: 'inventory/positions#update_positions' 当我从/users/1/edit 之类的路线跳转时,以前的路线无法正常工作。

在我的 /views/inventory/positions/update_positions.js.coffee 我有这个:

$("#positions_table").empty()
  .append('<%=j render 'inventory/positions/positions'%>');

多个查询如下所示:

Started GET "/inventory/positions/update_positions?media_id=1" for 78.84.173.112 at 2016-12-20 05:29:39 +0000
  Parameters: {"media_id"=>"1"}  
  #several queries follow
Started GET "/inventory/positions/update_positions?media_id=1" for 78.84.173.112 at 2016-12-20 05:29:39 +0000
  Parameters: {"media_id"=>"1"}
  #several queries follow

当我打开特定视图时,会发生这种情况,从下拉列表中选择“值:1”并呈现特定的部分。然后我转到不同部分的另一个 AJAX 视图,然后返回并再次选择“值:1”。如果我多次这样做,那么查询会发生越来越多的复制。当我进行整页刷新时它会停止 - 然后一切都从正常位置开始,但是当我多次重复选择时,查询再次增长。

【问题讨论】:

  • 在您的控制台中,是否显示“动态媒体选择确定!”当您更改下拉菜单或“AJAX 错误:...”时?
  • @luckyruby 不,似乎监听器根本不工作 - 控制台中没有任何内容。 `update_positions
  • `update_positions
  • 对不起 - update_positions 是控制器操作。

标签: javascript jquery ruby-on-rails ajax coffeescript


【解决方案1】:

application.html.erb中:

<!-- Main view  -->
<div id="yield">
  <div id="positions_index"></div>
  <%= yield %>
</div>

位置/index.js.coffee

$("#positions_index").html "<%= escape_javascript(render 'inventory/positions/index') %>"
$("#positions_index").on "change", "#media_list", (e) ->      
  $.get '/update_positions',
    media_id: $("#media_list option:selected").val()
  , null    

确保您在路线中定义了 update_positions。

【讨论】:

  • 谢谢,很有魅力!我天真的想法是使用 来渲染我的应用程序中的所有动态内容,因此我的导航栏不会刷新。你认为有什么选择可以避免将来在 application.html.erb 中出现大量&lt;div id=...&gt; 吗?
  • 傻我 :) 我将在每个页面中使用
    ,仅此而已。所以基本上当我加载应用程序的不同部分时,我会参考 id="yield"。
  • 拜托,你能检查一下我上面的更新吗,因为在实施你的positions/index.js.coffee 建议时,我在控制台中有一些奇怪的想法。视觉上我得到了想要的结果,但是“幕后”有很多不必要的查询在执行相同的更改事件时发生。
  • 不必要的查询是什么样的?
  • 请看我上面的Update 2
猜你喜欢
相关资源
最近更新 更多
热门标签