Rails在更新时设置空时间

时间:2014-10-08 11:36:56

标签: ruby-on-rails-3 datetime activerecord rails-activerecord

我有一个Rails 3.2.16遗留应用,我在每次通话en_route_time on_scene_time等处记录通话信息和时间,等等都是datetime字段。

在我的Call节目视图中,我有一个编辑时间路径,可通过get请求重定向到edit_times视图。这允许您编辑错误的时间。

在call_controller.rb中

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"}

1 个答案:

答案 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