Rails Ajax 刷新部分,同时持久化参数
Rails Ajax Refresh Partial while persisting params
我有一个Rails应用程序,带有一个名为"calls"的控制器/视图。 以下是索引的基本控制器操作:
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
以下是我的观点:
索引.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
});
索引.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则它限定region_id为"1"或从submit_tag传递的区域 ID 的任何调用范围。
这在控制器和视图中工作正常,但是这是我的问题。 我的索引.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
中可用您可以在其中将其传递给您尝试渲染的其他部分。
索引.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>
如果您有兴趣,请对此进行测试,并:)回复我
- 函数参数中的数据与指定变量之间的任何性能差异
- 使用Express捕获参数
- 参数变量出现ngTable指令问题
- AngularJS:我可以跳过函数参数回调吗
- 如何使用skip参数使用angular ui引导进行服务器端分页
- 要求未定义JS回调参数
- 我的jQuery插件参数没有正确启动,遇到了问题
- 获取@ResponseBody的一部分作为主干和Spring MVC控制器之间的参数
- jquery设置为使用参数运行
- Javascript”;类“;带有参数的扩展
- 为什么grunt contrib connect的中间件选项的第三个参数是未定义的
- 函数未将值作为参数传递
- 如何将参数传递到angularJs中的工厂
- JS:检查URL中的参数,然后迭代一个参数为var的函数
- 正在传递JSONP标头's数据参数到另一个文件中的AJAX请求
- MVC 3页面导航和使用javascript传递参数
- Rails Ajax 刷新部分,同时持久化参数
- 查询参数未在Ember.js中持久化
- 如何在ui-router中持久化浏览器上的可选状态参数
- 持久化其他数据源.在剑道数据网格中读取分页参数