我有一个Rails 3.2.16遗留应用,我在每次通话en_route_time
on_scene_time
等处记录通话信息和时间,等等都是datetime
字段。
在我的Call
节目视图中,我有一个编辑时间路径,可通过get请求重定向到edit_times
视图。这允许您编辑错误的时间。
edit_times
def edit_times
@call = Call.find(params[:id])
end
edit_times.html.erb
<%= form_for(@call) do |f| %>
<%= f.label :En_Route_Time %>
<%= f.date_select :en_route_time %>
<%= f.time_select :en_route_time,
:combined => true,
:default => Time.zone.now,
:include_blank => true,
:minute_interval => 1,
:time_separator => "",
:start_hour => 00,
:end_hour => 23 %>
<%= f.label :On_Scene_Time %>
<%= f.date_select :on_scene_time %>
<%= f.time_select :on_scene_time,
:combined => true,
:default => Time.zone.now,
:include_blank => true,
:minute_interval => 1,
:time_separator => "",
:start_hour => 00,
:end_hour => 23 %>
<%= f.label :To_Hospital_Time %>
<%= f.date_select :to_hospital_time %>
<%= f.time_select :to_hospital_time,
:combined => true,
:default => Time.zone.now,
:include_blank => true,
:minute_interval => 1,
:time_separator => "",
:start_hour => 00,
:end_hour => 23 %>
<%= f.label :At_Hospital_Time %>
<%= f.date_select :at_hospital_time %>
<%= f.time_select :at_hospital_time,
:combined => true,
:default => Time.zone.now,
:include_blank => true,
:minute_interval => 1,
:time_separator => "",
:start_hour => 00,
:end_hour => 23 %>
<%= f.label :In_Service_Time %>
<%= f.date_select :in_service_time %>
<%= f.time_select :in_service_time,
:combined => true,
:default => Time.zone.now,
:include_blank => true,
:minute_interval => 1,
:time_separator => "",
:start_hour => 00,
:end_hour => 23 %>
<%= f.button :Submit %>
<% end %>
这样可以正常工作,但是如果在没有填充时间的情况下编辑时间,则在选择空白0:00
时,update_attributes将使用默认时间。
所以我在calls_controller' to allow blank times if the
5i params is blank on the update action and use a
before_filter`中编写了以下私有方法来触发它。
calls_controller.rb
before_filter :filter_blank_call_times, only: [:update]
def filter_blank_call_times
if params[:call]['en_route_time(5i)'].blank?
params[:call]['en_route_time(1i)'] = ""
params[:call]['en_route_time(2i)'] = ""
params[:call]['en_route_time(3i)'] = ""
params[:call]['en_route_time(4i)'] = ""
params[:call]['en_route_time(5i)'] = ""
end
if params[:call]['on_scene_time(5i)'].blank?
params[:call]['on_scene_time(1i)'] = ""
params[:call]['on_scene_time(2i)'] = ""
params[:call]['on_scene_time(3i)'] = ""
params[:call]['on_scene_time(4i)'] = ""
params[:call]['on_scene_time(5i)'] = ""
end
if params[:call]['to_hospital_time(5i)'].blank?
params[:call]['to_hospital_time(1i)'] = ""
params[:call]['to_hospital_time(2i)'] = ""
params[:call]['to_hospital_time(3i)'] = ""
params[:call]['to_hospital_time(4i)'] = ""
params[:call]['to_hospital_time(5i)'] = ""
end
if params[:call]['at_hospital_time(5i)'].blank?
params[:call]['at_hospital_time(1i)'] = ""
params[:call]['at_hospital_time(2i)'] = ""
params[:call]['at_hospital_time(3i)'] = ""
params[:call]['at_hospital_time(4i)'] = ""
params[:call]['at_hospital_time(5i)'] = ""
end
if params[:call]['in_service_time(5i)'].blank?
params[:call]['in_service_time(1i)'] = ""
params[:call]['in_service_time(2i)'] = ""
params[:call]['in_service_time(3i)'] = ""
params[:call]['in_service_time(4i)'] = ""
params[:call]['in_service_time(5i)'] = ""
end
end
routes.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
collection do
get "scheduled"
get "call_search"
end
end
编辑时间时此功能正常,如果5i
datetime
字段为空,则可以输入空白时间。
我遇到的问题是当通过正常的编辑/更新约定编辑/更新呼叫时,每当我编辑呼叫时,无论何时都会消除呼叫。
我正在寻找一种在update
calls_controller.rb
方法中编写条件的方法,其中filter_blank_call_times
仅在5i
任何键为空时被调用。它现在的工作方式是,当您编辑时间时,它会调用update
上的calls_controller
操作并将所有时间设置为零。我需要找到一种方法,只在编辑时间时执行filter_blank_call_times
方法,而不是在编辑/更新呼叫时防止呼叫时间被消除。
如果有更好的方法,例如为edit_times
构建另一个控制器并将该资源嵌套在调用之下或以某种方式执行发布请求,而不是在update
上使用calls_controller
操作操作{1}}我很想听听它。
总而言之,编辑时间没有问题,但是在更新操作上调用它会消除时间调用,我需要找到解决方法。
如果我的问题不明确或您需要更多信息/代码,请告诉我。
以下是在update
calls_controller
操作时传递的参数除外
Started PUT "/calls/125" for 127.0.0.1 at 2014-10-08 06:59:05 -0500
Processing by CallsController#update as HTML
Parameters: {"utf8"=>"✓", "authenticity_token"=>"uH+XDJpZQDH4PNAuOOi7dfLVolfRzziMKWc/rSR6UMg=", "call"=>{"caller_name"=>"James Jelinek", "caller_phone"=>"281-444-2222", "caller_address"=>"", "patient_name"=>"Doe, John", "billing_address"=>"", "patient_dob"=>"2001-10-17", "patient_age"=>"12", "patient_sex_id"=>"1", "insurance_id"=>"4", "nature_id"=>"2", "region_id"=>"2", "transfer_from_id"=>"3", "transfer_from_other"=>"", "facility_from_location"=>"", "transfer_to_id"=>"", "transfer_to_other"=>"123 w 8th st Houston, TX 77088", "facility_to_location"=>"ER Room 2", "service_level_id"=>"1", "special_equipment_ids"=>["", "2"], "transfer_date(2i)"=>"10", "transfer_date(3i)"=>"2", "transfer_date(1i)"=>"2014", "transfer_date(5i)"=>"00:00:00", "wait_return"=>"yes", "parent_call_id"=>"124", "traffic_type"=>"Non-Emergency", "unit_ids"=>["", "1"], "call_status"=>"open"}, "button"=>"", "id"=>"125"}
答案 0 :(得分:0)
要检查所有零,零或空的时间,这个正则表达式应该有效。
"00:00:00"::=~(/[1-9]/).nil?
=> true
而不是手动编写所有内容,您可以编写代码以在#34;(5i)&#34;之前获取文本。并将所有其他值更改为空。代码看起来像这样:
params["call"].keys.each {|item|
post_text = "(5i)" # Set the target text we're looking for
if !!item[post_text] # If target text matches
if params["call"][item]::=~(/[1-9]/).nil? # Time is all zeros, nil, or empty
pre_text = item[0...item.index(post_text)] # get the text from before target
params["call"].keys.select {|i|
!!i[pre_text] and !i[post_text] #select the OTHER values that match the pre_text
}.each {|like_item|
params["call"][like_item] = "" # set all the OTHER values that match the same pre_text to ""
}
end
end
}
请注意,如果您想将(5i)
字段更改为空白,请将其更改为:
params["call"].keys.each {|item|
post_text = "(5i)" # Set the target text we're looking for
if !!item[post_text] # If target text matches
if params["call"][item]::=~(/[1-9]/).nil? # Time is all zeros, nil, or empty
pre_text = item[0...item.index(post_text)] # get the text from before target
params["call"].keys.select {|i|
!!i[pre_text] #select the values that match the pre_text (including post_text)
}.each {|like_item|
params["call"][like_item] = "" # set all the values that match the same pre_text to ""
}
end
end
}
其中任何一个都放在
中def filter_blank_call_times
# CODE HERE
end