[英]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=✓®ion[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.