我有一个Rails应用程序,其控制器/视图称为“调用”。以下是索引的基本控制器操作:
calls_controller.rb
onDestroy()
以下是我的观点:
index.js.erb的
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.html.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
});
_assigned_calls.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>
所以正在发生的事情是页面加载,如果我没有参数:传递区域设置调用而不是按区域划分范围。如果region_id存在,那么它会调用region_id为“1”的调用或者从submit_tag传递的区域ID。
这在控制器和视图中工作正常,但这是我的问题。我的index.html.erb我需要刷新部分而不会打扰传递的参数。所以在setInterval上我需要弄清楚如何在持久保存URL中传递的参数的同时重新加载部分。
我尝试使用setInterval方法解决这个问题,但我不确定我在这里做了100%。
有人可以给我一些关于如何在保持params的同时每隔5秒刷新一次部分的建议,这样我的实例变量会通过刷新持续存在吗?
如果您需要更多背景信息和/或代码,请告知我们。
更新 尝试根据用户的回答重新编写javascript,这就是我所拥有的。
<%= 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' %>
页面将加载,但当它尝试在chrome检查器中触发时,我得到:
<script>
$(document).ready(function() {
setInterval(function () {
$.ajax({
url: 'calls_path',
type: "GET",
data: { "region": '<%= @region.html_safe %>' }
}), 5000);
});
});
</script>
也许这是一个JS语法错误,或者我没有正确关闭该函数。
答案 0 :(得分:0)
如果我理解正确,你想让你的参数以某种方式通过对你的控制器的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>
如果您有兴趣并请回复我,请测试一下:)