Ajax Rails将_链接到远程Put方法,但未刷新Nihlclass
我有一个Rails 3.2.14应用程序,在该应用程序中,我有通话、通话有单位、单位有状态,以及模型中的通话时间,例如in_service_time 我正在尝试编写一个名为in_service的控制器操作,它将设备状态更新为“in service”,并将时间戳call.in_service_time to time.zone.now,并通过put remote(Ajax)完成所有这些操作 到目前为止,我所写的似乎是通过更新设备状态和打电话的时间戳来实现的。但是使用:remote=>true不会呈现我在in_服务操作中指定的部分。我必须等待屏幕通过index.html.erb中的getScript调用刷新,以更新调用状态。如果我使用:remote=>false,它会立即重新加载页面而不会出现问题。如果我使用:remote=>true,我还会在NihlClass的development.log中抛出一个异常 以下是相关代码的摘录,完整代码可在此处找到,以便于阅读: index.html.erbAjax Rails将_链接到远程Put方法,但未刷新Nihlclass,ajax,ruby-on-rails-3,routes,null,link-to,Ajax,Ruby On Rails 3,Routes,Null,Link To,我有一个Rails 3.2.14应用程序,在该应用程序中,我有通话、通话有单位、单位有状态,以及模型中的通话时间,例如in_service_time 我正在尝试编写一个名为in_service的控制器操作,它将设备状态更新为“in service”,并将时间戳call.in_service_time to time.zone.now,并通过put remote(Ajax)完成所有这些操作 到目前为止,我所写的似乎是通过更新设备状态和打电话的时间戳来实现的。但是使用:remote=>true不会呈
<div id="active">
<%= render "assigned_calls" %>
</div>
<div id="inactive">
<%= render "unassigned_calls" %>
</div>
<script>
$(function() {
setInterval(function(){
$.getScript("/calls").fail(function(jqxhr, settings, exception) {
window.location = "/users/sign_in?duplicate_session=true";
});
}, 10000);
});
</script>
$("#active").html("<%= escape_javascript render("assigned_calls") %>");
$("#inactive").html("<%= escape_javascript render("unassigned_calls") %>");
<div class="page-header">
<span class="badge badge-important"><%= @unassigned.count %></span> <strong>Unassigned calls</strong>
<span class="badge badge-info"><%= @assigned.count %></span> <strong>Active calls</strong>
<span class="badge badge-warning"><%= @scheduled.count %></span> <strong>Scheduled calls</strong>
<%= render "search" %>
<h2>Active Calls</h2>
</div>
<% @assigned.each do |call| %>
<div class="widget">
<div class="widget-header">
<div class="pull-right">
<%= link_to 'View', call, :class => 'btn btn-close'%>
<% if dispatch? %>
<%= link_to 'Edit', edit_call_path(call), :class => 'btn btn-close'%>
<%= link_to 'Close', close_call_path(call), confirm: 'Are you sure you want to close the call?', :method => :post, :class => 'btn btn-danger' %>
<%= link_to 'Cancel', cancel_call_path(call), confirm: 'Are you sure you want to cancel the call?', :method => :post, :class => 'btn btn-warning' %>
<% end %>
</div>
<i class="icon-phone"></i>
<h3><%= link_to call.incident_number, call %> <span><%= status(call) %></span></h3>
<% if call.traffic_type == "Emergency" %>
<span class="badge badge-important"><%= call.traffic_type %></span>
<% else %>
<span class="badge badge-info"><%= call.traffic_type %></span>
<% end %>
</div>
<div class="widget-content">
<div class="row">
<div class="span3">
<h4>Patient Name: <small><%= call.patient_name %></small></h4>
<div class="large-display">
<% if call.call_status == "open" %>
<div class="large <%= elapsed_overdue(call.elapsed_time) %>"><%= TimeFormatter.format_time(call.elapsed_time)%></div>
<div class="small">Elapsed Time</div>
<% else %>
<% if call.closed_at? %>
<div class="large <%= elapsed_overdue(call.run_time) %>"><%= TimeFormatter.format_time(call.run_time)%></div>
<div class="small">Run Time</div>
<% end %>
<% end %>
</div>
</div>
<div class="span2">
<address>
<strong><%= transferred_from(call) %></strong><br>
<%= transferred_from_address(call) %>
</address>
</div>
<div class="span1"><i class="icon-arrow-right dim"></i></div>
<div class="span2">
<address>
<strong><%= transferred_to(call) %></strong><br>
<%= transferred_to_address(call) %>
</address>
</div>
<div class="span3">
<% if call.service_level.level_of_service == "WC" %>
<div class="left-icon dim"><i class="icon-user"></i></div>
<% else %>
<div class="left-icon dim"><i class="icon-ambulance"></i></div>
<% end %>
Assigned to <strong>Unit <%= call.units.map(&:unit_name).join(", ") %></strong><br />
<% call.units.each do |unit| %>
<div class="<%= set_status(unit.status) %>"><%= unit_status(unit) %></div>
<% end %>
</div>
</div>
<hr />
<div class="row">
<div class="span2">
<div class="large-display">
<div class="medium <%= transfer_due(call.transfer_date) %>"><%= call.transfer_date.strftime("%m/%d/%y %H:%M") %></div>
<div class="small">Transfer Date</div>
</div>
</div>
<div class="span1">
<div class="large-display">
<div class="small"><%= call.nature.try(:determinant) %></div>
<div class="small">Nature</div>
</div>
</div>
<div class="span5">
<% if call.unit_ids.present? %>
<div class="large-display">
<div class="progress progress-striped"><%= progress_bar(call) %></div>
<div class="small"><%= call.units.first.status.unit_status %></div>
<div><%= link_to 'En Route', en_route_call_path(call), :class => 'btn btn-warning btn-medium', :method => :put, :remote => true %><%= link_to 'On Scene', on_scene_call_path(call), :class => 'btn btn-primary btn-medium', :method => :put, :remote => true %><%= link_to 'To Hospital', to_hospital_call_path(call), :class => 'btn btn-warning btn-medium', :method => :put, :remote => true %><%= link_to 'At Hospital', at_hospital_call_path(call), :class => 'btn btn-danger btn-medium', :method => :put, :remote => true %><%= link_to 'In Service', in_service_call_path(call), :class => 'btn btn-success btn-medium', :method => :put, :remote => true %></div>
<div>ER: <%= call.en_route_time.try(:strftime, "%m/%d/%y-%k:%M") %> OS: <%= call.on_scene_time.try(:strftime, "%m/%d/%y-%k:%M") %> TO: <%= call.to_hospital_time.try(:strftime, "%m/%d/%y-%k:%M") %> AT: <%= call.at_hospital_time.try(:strftime, "%m/%d/%y-%k:%M") %> IS: <%= call.in_service_time.try(:strftime, "%m/%d/%y-%k:%M") %></div>
</div>
<% end %>
</div>
<div class="span3">
<div class="left-icon dim"><i class="icon-user"></i></div>
<%= render partial: "medics_for_call", locals: {call: call} %>
</div>
</div>
</div>
</div>
<% end %>
呼叫_controller.rb摘录
resources :calls do
member do
post 'close'
post 'cancel'
post 'note'
get 'opencall'
get 'new_return'
get 'duplicate_call'
get 'edit_times'
put 'update_billing'
post 'dispatch_call'
put 'en_route'
put 'on_scene'
put 'to_hospital'
put 'at_hospital'
put 'in_service'
end
def in_service
@call = Call.find(params[:id])
@unit = @call.units.first
@call.update_attributes(in_service_time: Time.zone.now)
@call.save
@unit.status = Status.find_by_unit_status("In Service")
@unit.save
respond_to do |format|
format.html { redirect_to calls_url }
format.js { render "index" }
end
end
NoMethodError - undefined method `count' for nil:NilClass:
app/views/calls/_assigned_calls.html.erb:2:in `_app_views_calls__assigned_calls_html_erb___2549181816739942207_70125964034780'
\u assigned\u calls.html.erb
<div id="active">
<%= render "assigned_calls" %>
</div>
<div id="inactive">
<%= render "unassigned_calls" %>
</div>
<script>
$(function() {
setInterval(function(){
$.getScript("/calls").fail(function(jqxhr, settings, exception) {
window.location = "/users/sign_in?duplicate_session=true";
});
}, 10000);
});
</script>
$("#active").html("<%= escape_javascript render("assigned_calls") %>");
$("#inactive").html("<%= escape_javascript render("unassigned_calls") %>");
<div class="page-header">
<span class="badge badge-important"><%= @unassigned.count %></span> <strong>Unassigned calls</strong>
<span class="badge badge-info"><%= @assigned.count %></span> <strong>Active calls</strong>
<span class="badge badge-warning"><%= @scheduled.count %></span> <strong>Scheduled calls</strong>
<%= render "search" %>
<h2>Active Calls</h2>
</div>
<% @assigned.each do |call| %>
<div class="widget">
<div class="widget-header">
<div class="pull-right">
<%= link_to 'View', call, :class => 'btn btn-close'%>
<% if dispatch? %>
<%= link_to 'Edit', edit_call_path(call), :class => 'btn btn-close'%>
<%= link_to 'Close', close_call_path(call), confirm: 'Are you sure you want to close the call?', :method => :post, :class => 'btn btn-danger' %>
<%= link_to 'Cancel', cancel_call_path(call), confirm: 'Are you sure you want to cancel the call?', :method => :post, :class => 'btn btn-warning' %>
<% end %>
</div>
<i class="icon-phone"></i>
<h3><%= link_to call.incident_number, call %> <span><%= status(call) %></span></h3>
<% if call.traffic_type == "Emergency" %>
<span class="badge badge-important"><%= call.traffic_type %></span>
<% else %>
<span class="badge badge-info"><%= call.traffic_type %></span>
<% end %>
</div>
<div class="widget-content">
<div class="row">
<div class="span3">
<h4>Patient Name: <small><%= call.patient_name %></small></h4>
<div class="large-display">
<% if call.call_status == "open" %>
<div class="large <%= elapsed_overdue(call.elapsed_time) %>"><%= TimeFormatter.format_time(call.elapsed_time)%></div>
<div class="small">Elapsed Time</div>
<% else %>
<% if call.closed_at? %>
<div class="large <%= elapsed_overdue(call.run_time) %>"><%= TimeFormatter.format_time(call.run_time)%></div>
<div class="small">Run Time</div>
<% end %>
<% end %>
</div>
</div>
<div class="span2">
<address>
<strong><%= transferred_from(call) %></strong><br>
<%= transferred_from_address(call) %>
</address>
</div>
<div class="span1"><i class="icon-arrow-right dim"></i></div>
<div class="span2">
<address>
<strong><%= transferred_to(call) %></strong><br>
<%= transferred_to_address(call) %>
</address>
</div>
<div class="span3">
<% if call.service_level.level_of_service == "WC" %>
<div class="left-icon dim"><i class="icon-user"></i></div>
<% else %>
<div class="left-icon dim"><i class="icon-ambulance"></i></div>
<% end %>
Assigned to <strong>Unit <%= call.units.map(&:unit_name).join(", ") %></strong><br />
<% call.units.each do |unit| %>
<div class="<%= set_status(unit.status) %>"><%= unit_status(unit) %></div>
<% end %>
</div>
</div>
<hr />
<div class="row">
<div class="span2">
<div class="large-display">
<div class="medium <%= transfer_due(call.transfer_date) %>"><%= call.transfer_date.strftime("%m/%d/%y %H:%M") %></div>
<div class="small">Transfer Date</div>
</div>
</div>
<div class="span1">
<div class="large-display">
<div class="small"><%= call.nature.try(:determinant) %></div>
<div class="small">Nature</div>
</div>
</div>
<div class="span5">
<% if call.unit_ids.present? %>
<div class="large-display">
<div class="progress progress-striped"><%= progress_bar(call) %></div>
<div class="small"><%= call.units.first.status.unit_status %></div>
<div><%= link_to 'En Route', en_route_call_path(call), :class => 'btn btn-warning btn-medium', :method => :put, :remote => true %><%= link_to 'On Scene', on_scene_call_path(call), :class => 'btn btn-primary btn-medium', :method => :put, :remote => true %><%= link_to 'To Hospital', to_hospital_call_path(call), :class => 'btn btn-warning btn-medium', :method => :put, :remote => true %><%= link_to 'At Hospital', at_hospital_call_path(call), :class => 'btn btn-danger btn-medium', :method => :put, :remote => true %><%= link_to 'In Service', in_service_call_path(call), :class => 'btn btn-success btn-medium', :method => :put, :remote => true %></div>
<div>ER: <%= call.en_route_time.try(:strftime, "%m/%d/%y-%k:%M") %> OS: <%= call.on_scene_time.try(:strftime, "%m/%d/%y-%k:%M") %> TO: <%= call.to_hospital_time.try(:strftime, "%m/%d/%y-%k:%M") %> AT: <%= call.at_hospital_time.try(:strftime, "%m/%d/%y-%k:%M") %> IS: <%= call.in_service_time.try(:strftime, "%m/%d/%y-%k:%M") %></div>
</div>
<% end %>
</div>
<div class="span3">
<div class="left-icon dim"><i class="icon-user"></i></div>
<%= render partial: "medics_for_call", locals: {call: call} %>
</div>
</div>
</div>
</div>
<% end %>
您从未在
in_服务
操作中设置@unassigned
。因此,向其发送count
会引发异常
从其他动作呈现动作的视图(呈现“索引”
)不会执行动作的控制器代码
编辑:如何使其干燥:
class CallsController < ApplicationController
...
def index
setup_scheduling_variables
@units = Unit.order("unit_name")
@overdue = @assigned.select{|call| call.elapsed_time > 3600}
@inservice = Unit.in_service
end
def in_service
...
respond_to do |format|
format.html { redirect_to calls_url }
format.js do
setup_scheduling_variables
render "index"
end
end
end
private
def setup_scheduling_variables
@assigned = params[:search].present? ? Call.search(params[:search]) : Call.assigned_calls.until_end_of_day.order("transfer_date ASC")
@unassigned = Call.unassigned_calls.until_end_of_day
@scheduled = Call.scheduled_calls
end
class CallsController3600}
@运行中=机组运行中
结束
def在用
...
回应待办事项|格式|
format.html{redirect_to calls_url}
format.js do
设置\u调度\u变量
渲染“索引”
结束
结束
结束
私有的
def设置_调度_变量
@赋值=参数[:搜索]。存在?Call.search(params[:search]):Call.assigned_calls.直到_day.order的_end_(“转账日期ASC”)
@unassigned=Call.unassigned\u calls.until\u结束\u天
@预定=呼叫。预定的呼叫
结束
你说得对!我是凭记忆写的,在一个一年没碰过的旧控制器上有一个这样的例子。最后,我不得不添加已分配、未分配和已调度的实例变量,这些变量是索引操作的一部分,以消除异常。现在,页面将通过Ajax/JS刷新,并且不会引发异常。谢谢你帮我记住这个惯例。我已经有一段时间没有接触代码了。新犯的错误(在我的控制器操作中,“在服务中”有没有更好、更干净的方法来写这篇文章?对我来说,这似乎很难。我的意思是它可以工作,但如果我可以的话,我想清理一下。是的,确保你保持它干净,将代码提取到一个私有共享方法会使它干净。我确实计划把它干掉。这是我的第一个Rails应用程序,我正在进行重构ing。我只是想知道是否有一种更干净的方式来编写in_service action。我所写的虽然有效,但肯定有一种更好的方式。谢谢你提供了一个干巴巴的例子,这真的很干净!