Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 第一次迭代后退出循环的Rails_Ruby On Rails_Loops - Fatal编程技术网

Ruby on rails 第一次迭代后退出循环的Rails

Ruby on rails 第一次迭代后退出循环的Rails,ruby-on-rails,loops,Ruby On Rails,Loops,我有一个for循环,它应该循环通过对象的键,我注意到它似乎在第一次迭代时退出。我的控制器使用当前日期初始化我的服务,并调用parse\u leadsparse_leads然后调用grouped_leads\u by_location,并开始在返回的对象中循环。这个循环似乎在第一次迭代时退出 # Controller def generate_invite_texts params[:signature] == ENV['TEMPORIZE_KEY'] ? valid = tru

我有一个for循环,它应该循环通过对象的键,我注意到它似乎在第一次迭代时退出。我的控制器使用当前日期初始化我的服务,并调用
parse\u leads
parse_leads
然后调用
grouped_leads\u by_location
,并开始在返回的对象中循环。这个循环似乎在第一次迭代时退出

# Controller
def generate_invite_texts
        params[:signature] == ENV['TEMPORIZE_KEY'] ? valid =  true : valid = false

        if valid
            p "Valid: generate invite texts, #{Time.current.in_time_zone('America/New_York')}"
            SakariService.new(Time.current.in_time_zone('America/New_York').to_date).parse_leads
        else
            p "invalid key: generate invite texts"
        end

        head :ok
end

# SakariService.rb
class SakariService
    include HTTParty
    attr_reader :date
    base_uri 'https://api.sakari.io'

    def initialize(date, no_auth = false)
        @options = {
            headers: {
                'Content-Type' => 'application/json'
            }
        }
        @attempts = 0
        @date = date.to_date.end_of_day
        @potential_clients = PotentialClient.date_filter(@date.beginning_of_day, @date.end_of_day)
    end



    # ******************************************************************
    # Begin functionality for scheduling the texts to be sent
    # ******************************************************************
    def parse_leads
        grouped_leads_by_location.keys.each do |location_id|
            p "LocationID: #{location_id}"
            send_text_at = calc_send_time(location_id)
            p "Send text at: #{send_text_at}"
            schedule_text(send_text_at, location_id) if send_text_at.present?
        end
    end


    # Adds two business days and 2 hours to date
    def calc_send_time(location_id)
        start_date_range = Date.current + 2.days
        end_date_range = start_date_range + 4.days
        date_range = ( start_date_range .. end_date_range )
        location = Location.find(location_id)

        p "start: #{start_date_range}"
        p "end: #{end_date_range}"
        p "range: #{date_range}"

        date_range.each do |possible_date|
            p "testing: #{possible_date}"
            if !is_weekend?(possible_date) and !Location.is_holiday?(possible_date) and location.is_open_by_date?(possible_date)
                time = location.get_open_time(possible_date) + 2.hours
                send_text_at = Time.zone.parse("#{possible_date.strftime("%F")} #{time.strftime("%T")}")
                return send_text_at
                break
            end
        end

        return nil
    end

    def grouped_leads_by_location
      grouped_leads = @potential_clients \
        .group_by { |pc| pc.location_id } \
        .keep_if { |k, v| !k.nil? }

        # outputs something like:  { "1" => [#<PotentialClient:0x00000006cb1910> {...}, ...], "2" => [#<PotentialClient:0x00000006cb1910> {...}, ...]}
    end

    def schedule_text(datetime, location_id)
        p "scheduling text: #{location_id} - #{datetime}"
        datetime = datetime.to_datetime
        SakariTextWorker.perform_at(datetime, @date, location_id)
    end
end
#控制器
def生成邀请文本
参数[:签名]==ENV['temporation_KEY']?valid=true:valid=false
如果有效
p“有效:生成邀请文本,#{Time.current.in_时区('America/New_York')}”
SakariService.new(Time.current.in_时区('America/new_York')。到日期)。解析线索
其他的
p“无效密钥:生成邀请文本”
结束
头:好的
结束
#SakariService.rb
类SakariService
包括HTTParty
属性读取器:日期
基_uri'https://api.sakari.io'
def初始化(日期,no_auth=false)
@选项={
标题:{
'内容类型'=>'应用程序/json'
}
}
@尝试次数=0
@日期=日期。截止日期。结束日期
@潜在客户=潜在客户。日期过滤器(@date.start\u of \u day,@date.end\u of \u day)
结束
# ******************************************************************
#开始安排要发送的文本的功能
# ******************************************************************
def parse_线索
按_location.key.each do | location_id分组的_leads|
p“位置id:#{location_id}”
发送时间=计算发送时间(位置id)
p“在以下位置发送文本:#{Send_text_at}”
如果当前发送文本,则安排文本(发送文本,位置id)?
结束
结束
#将两个工作日和两个小时添加到日期
def计算发送时间(位置id)
开始日期范围=date.current+2.5天
结束日期范围=开始日期范围+4.5天
日期范围=(开始日期范围..结束日期范围)
位置=位置。查找(位置\u id)
p“开始:#{start_date_range}”
p“结束:{end_date_range}”
p“范围:#{date_range}”
日期|范围。每个do |可能的|日期|
p“测试:{可能的日期}”
如果!周末吗?(可能的日期)和!地点。是否度假?(可能的日期)和地点。是否在日期之前开放?(可能的日期)
时间=地点。打开时间(可能的日期)+2.5小时
send_text_at=Time.zone.parse(“#{date.strftime(“%F”)}{Time.strftime(“%T”)}”)
返回发送文本到
打破
结束
结束
归零
结束
def按位置分组的_Lead_
分组的客户线索=@潜在客户\
.group_by{| pc | pc.location_id}\
.如果{k,v |!k.nil?}保持
#输出如下内容:{“1”=>[{…},…],“2”=>[{…},…]}
结束
def计划文本(日期时间、位置id)
p“调度文本:#{location_id}-#{datetime}”
datetime=datetime.to_datetime
SakariTextWorker.perform_at(datetime,@date,location_id)
结束
结束
在我的日志中,我看到以下内容:

"Valid: generate invite texts, 2020-04-11"
"potential_clients"
D, [2020-04-11T04:56:02.562327 #4] DEBUG -- : [7b48a6db-0d4c-4dd2-9ed5-d436eab62e57]   PotentialClient Load (5.7ms)  SELECT "potential_clients".* FROM "potential_clients" WHERE (potential_clients.created_at >= '2020-04-11 04:00:00' and potential_clients.created_at <= '2020-04-12 03:59:59.999999')
"LocationID: 40"
D, [2020-04-11T04:56:02.564703 #4] DEBUG -- : [7b48a6db-0d4c-4dd2-9ed5-d436eab62e57]   Location Load (0.7ms)  SELECT  "locations".* FROM "locations" WHERE "locations"."id" = $1 LIMIT $2  [["id", 40], ["LIMIT", 1]]
"start: 2020-04-13"
"end: 2020-04-17"
"range: 2020-04-13..2020-04-17"
"testing: 2020-04-13"
"Send text at: 2020-04-13 11:00:00 -0400"
"scheduling text: 40 - 2020-04-13 11:00:00 -0400"
“有效:生成邀请文本,2020-04-11”
“潜在客户”

D、 [2020-04-11T04:56:02.562327#4]调试--:[7b48a6db-0d4c-4dd2-9ed5-d436eab62e57]潜在客户机负载(5.7ms)从“潜在客户机”中选择“潜在客户机”。*其中(潜在客户机。创建时间>='2020-04-11 04:00:00'和潜在客户机。在您说“为位置运行循环,然后永不继续”时创建”,控制器操作完成了吗?我想知道“SakariTextWorker.perform_at(datetime,@date,location_id)”异步或阻止操作完成。正如您在日志中所看到的,只有
分组\u中的第一个键按\u位置引导\u。打印键
。循环永远不会继续到下一个。控制器操作返回时,返回的标题为:ok?这是一个与时区相关的错误-\u-。感谢您的帮助“循环针对位置\u id 40运行,然后再也不会继续”,控制器操作是否完成?我想知道“SakariTextWorker.perform\u at(datetime,@date,location\u id)“是异步的,或者它正在阻止操作完成。正如您在日志中所看到的,只有
分组中的第一个键按位置引导。会打印键
。循环将永远不会继续到下一个。控制器操作返回时返回head:ok?它最终是一个与时区相关的错误-。我感谢您的帮助。”