簡體   English   中英

Rails Ajax在保留參數的同時刷新Partial

[英]Rails Ajax Refresh Partial while persisting params

我有一個帶控制器/視圖的Rails應用,稱為“調用”。 這是索引的基本控制器操作:

calls_controller.rb

def index
    if params[:region].present?
      @assigned = Call.where(region_id: params[:region][:area]).assigned_calls.until_end_of_day
      @unassigned = Call.where(region_id: params[:region][:area]).unassigned_calls.until_end_of_day
   else
     @assigned = Call.assigned_calls.until_end_of_day
     @unassigned = Call.unassigned_calls.until_end_of_day
   end
  end

這是我的看法:

index.js.erb

$('#active').html("<%= escape_javascript render :partial => 'calls/assigned_calls', :locals => {:assigned_calls => @assigned} %>");
$('#inactive').html("<%= escape_javascript render :partial => 'calls/unassigned_calls', :locals => {:unassigned_calls => @unassigned} %>"); 

$(".select").select2({
        placeholder: "Select One",
        allowClear: true
  });

index.html.erb

<div id="active">
  <%= render "assigned_calls" %>
</div>

<div id="inactive">
  <%= render "unassigned_calls" %>
</div>


<script>
$(document).ready(function() {
    setInterval(function () {
            $.ajax('calls/<%= params[:region][:area] %>');
    } , 5000);
});
</script>

_assigned_calls.html.erb(省略查看代碼)

<%= form_tag calls_path, :method => 'get' do %>
  <p>
<%= select_tag "region[area]", options_from_collection_for_select(Region.order(:area), :id, :area, selected: params[:region].try(:[], :area)), prompt: "Choose Region" %>
<%= submit_tag "Select", :name => nil, :class => 'btn' %>

因此,如果我沒有傳遞:region的參數,那么頁面加載會發生什么,它會設置調用而不會受到區域范圍的限制。 如果存在region_id,則它將范圍限定為“ 1”或從Submit_tag傳遞的Region ID是什么的調用。

這在控制器和視圖中工作正常,但是這是我的問題。 我的index.html.erb我需要刷新部分內容,而不會干擾傳遞的參數。 因此,在setInterval上,我需要弄清楚如何在保留URL中傳遞的參數的同時重新加載部分。

我試圖使用setInterval方法解決這個問題,但是我不確定100%在這里做什么。

有人可以給我一些關於如何在持久化參數的同時每5秒鍾刷新部分內容的建議,以便我的實例變量通過刷新持久化嗎?

如果您需要更多上下文和/或代碼,請告訴我。

更新嘗試根據用戶的回答對javascript進行返工,這就是我所擁有的。

<script>
  $(document).ready(function() {
    setInterval(function () {
      $.ajax({
        url: 'calls_path',
        type: "GET",
        data: { "region": '<%= @region.html_safe %>' }
      }), 5000);
    });
  });
</script>

該頁面將加載,但是當它嘗試在Chrome檢查器中觸發時,我得到了:

calls?utf8=✓&region[area]=3:2901 Uncaught SyntaxError: Unexpected token )

也許這是JS語法錯誤,或者我沒有正確關閉該函數。

如果我正確理解,您希望通過AJAX調用以某種方式將參數傳遞給控制器​​,然后返回到刷新部分的js.erb文件?

我的建議是像這樣在控制器中將傳遞的參數設置為實例變量:

calls_controller.rb

def index
  if params[:region].present?
    @region = params[:region]

    @assigned = Call.where(region_id: params[:region][:area]).assigned_calls.until_end_of_day
    @unassigned = Call.where(region_id: params[:region][:area]).unassigned_calls.until_end_of_day
  else
    @assigned = Call.assigned_calls.until_end_of_day
    @unassigned = Call.unassigned_calls.until_end_of_day
  end
end

現在,您的@region實例變量將在index.js.erb中可用,您可以在其中將其傳遞給您嘗試呈現的其他部分。

index.js.erb

$('#active').html("<%= escape_javascript render :partial => 'calls/assigned_calls', :locals => { :assigned_calls => @assigned, :region => @region } %>");
$('#inactive').html("<%= escape_javascript render :partial => 'calls/unassigned_calls', :locals => { :unassigned_calls => @unassigned, :region => @region } %>");

_assigned_calls.html.erb

<%= form_tag calls_path, :method => 'get' do %>
  <%= select_tag "region[area]", options_from_collection_for_select(Region.order(:area), :id, :area, selected: region.try(:[], :area)), prompt: "Choose Region" %>
  <%= submit_tag "Select", :name => nil, :class => 'btn' %>
<% end %>

另外,我認為在index.html.erb腳本標記中的更好做法是這樣做:

<script>
   $(document).ready(function() {
     setInterval(function () {
       $.ajax({
         url: 'calls_path',
         type: "GET",
         data: { "region": '<%= @region.html_safe %>' }
       });
     }, 5000);
   });
</script>

如果您有興趣,請測試一下,然后再回覆給我:)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM