【问题标题】:Rails Setting Null Times on UpdateRails 在更新时设置 Null 时间
【发布时间】:2016-08-26 23:00:05
【问题描述】:

我有一个 Rails 3.2.16 旧版应用程序,我在其中记录每次通话的通话信息和时间 en_route_time on_scene_time 等都是 datetime 字段。

在我的Call 显示视图中,我有一个编辑时间路径,它通过获取请求重定向到edit_times 视图。这允许您在出现错误时编辑时间。

calls_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 %>

这很好用,但是在编辑时间时,如果未填充时间,它将使用默认时间 update_attributes 选择空白0:00

于是我在calls_controller' to allow blank times if the5iparams is blank on the update action and use abefore_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 字段为空白,则允许输入空白时间。

我遇到的问题是,当通过正常的编辑/更新约定编辑/更新呼叫时,每当我编辑呼叫时,它就会消除那里的任何时间。

我正在寻找一种方法来在calls_controller.rbupdate 方法中编写条件,其中只有在5i 中的任何一个键为空时才会调用filter_blank_call_times。它现在的工作方式是,当您编辑时间时,它会在calls_controller 上调用update 操作并将所有时间设置为零。我需要找到一种方法,只在编辑时间时执行 filter_blank_call_times 方法,而不是在编辑/更新呼叫时执行,以防止呼叫时间被清除。

如果有更好的方法来做到这一点,例如为edit_times 构建另一个控制器并将该资源嵌套在调用下或以某种方式执行发布请求而不是在update 上使用update 操作操作@ I'很想听听。

总而言之,编辑时间没有问题,但是在更新操作中调用它会消除时间调用,我需要想办法解决这个问题。

如果我的问题不清楚或者您需要更多信息/代码,请告诉我。

这是在 calls_controller 中调用 update 操作时传递的参数的一个例外

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

【问题讨论】:

  • 为什么 5(i) 键不能有 00 代替?
  • @Surya 抱歉,我不确定我是否理解您的要求。如果我编辑时间并且尚未填充时间,我希望它是一个 nil 值而不是默认为 0:00 的 datetime 对象
  • 我也不明白你想说什么。可以将params的日志数据在发布到create/update方法的时候发布吗?
  • @Surya 很抱歉造成误会,当calls_controller 调用update 时,我用参数哈希的示例日志更新了我的问题
  • 见:"transfer_date(5i)"=&gt;"00:00:00"params 它有 00:00:00 所以我的问题是:为什么你需要寻找 .blank? 你可以简单地让 00,对吧?

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


【解决方案1】:

要根据全零、零或空来检查时间,这个正则表达式应该可以工作。

"00:00:00"::=~(/[1-9]/).nil?
 => true 

您可以编写代码来获取“(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] 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

【讨论】:

    猜你喜欢
    • 2017-04-04
    • 1970-01-01
    • 2018-08-28
    • 1970-01-01
    • 2012-02-22
    • 2010-12-07
    • 2014-04-30
    • 1970-01-01
    相关资源
    最近更新 更多