Rails 5:使用AJAX在另一个部分渲染部分

时间:2016-12-17 11:35:48

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

我试图在" link_to"上实施AJAX时陷入困境。视图已呈现,在该视图中,我有另一个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') %>")

这是reposition /positions / _index.html.erb partial。在那里,我有<div id="media_list"><div id='positions_table'>

在资产/ 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 呈现第二部分(/视图/../位置/ _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

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

1 个答案:

答案 0 :(得分:1)

application.html.erb

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

positions / 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。