2016-04-21 44 views
0

我有一个Rails应用程序,带有一个名为“calls”的控制器/视图。下面是指数基本控制器动作:Rails Ajax刷新部分持续参数

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 
    }); 

指数.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' %> 

所以发生了什么事是在页面加载,如果我没有的PARAMS:区域通过它设置而不范围的呼叫按地区划分。如果region_id存在,那么它将region_id为“1”的调用范围或从submit_tag传递的任何区域ID作为范围。

这在控制器和视图中正常工作,但这里是我的问题。我的index.html.erb我需要刷新部分,而不会干扰通过的参数。所以在setInterval我需要弄清楚如何重新加载partials,同时保持在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语法错误,不然我无法正常关闭功能。

回答

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> 

如果您有兴趣并请回复我,请对此进行测试:)

+0

感谢您的建议。我剪切/粘贴了这个,并且我在_assigned_calls.html.erb的第5行得到了'未定义的局部变量或方法'region''这是违规行:'<%= select_tag“region [area]”,options_from_collection_for_select(Region .order(:area),:id,:area,选中:region.try(:[],:area)),提示:“选择区域”%> '有什么想法? – nulltek

+0

我可以通过将第5行更改为<%= select_tag“region [area]”,options_from_collection_for_select(Region.order(:area),:id,:area,selected:params [:region] .try( :[],:area)),提示:使用params [:region]而不是局部变量区域来选择区域%>。不知道为什么它没有正确连接。 – nulltek

+0

当我在我的option_from_collection_for_select中使用params时,它工作正常,但javascript从index.html.erb中提供了“calls?utf8 =✓&region [area] = 4:6387 Uncaught SyntaxError:Unexpected token)”。 – nulltek