【问题标题】:rake task with assignment ||= coming back nilrake task with assignment ||= 返回 nil
【发布时间】:2014-06-20 16:04:53
【问题描述】:

为什么在我的 rake 任务中哈希仍然返回 nil?

namespace :pull_and_update_liverail_daily do
  desc 'Pull and Update'
  task :by_date,  [:date_start, :date_end] => :environment do |t,args|
    args[:date_start] ||= DateTime.yesterday.strftime('%Y-%m-%d')
    args[:date_end]   ||= DateTime.yesterday.strftime('%Y-%m-%d')
    Rake::Task["stats:import_all"].invoke(args[:date_start], args[:date_end])
    Rake::Task["update_daily_stats:by_date"].invoke(args[:date_start])
  end
end

虽然这行得通..

    date_start = args[:date_start] || DateTime.yesterday.strftime('%Y-%m-%d')
    date_end   = args[:date_end]   || DateTime.yesterday.strftime('%Y-%m-%d')

【问题讨论】:

    标签: ruby-on-rails ruby ruby-on-rails-4 rake


    【解决方案1】:

    你应该使用with_defaults:

    namespace :pull_and_update_liverail_daily do
      desc 'Pull and Update'
      task :by_date,  [:date_start, :date_end] => :environment do |t,args|
        args.with_defaults(date_start: DateTime.yesterday.strftime('%Y-%m-%d'),
                           date_end: DateTime.yesterday.strftime('%Y-%m-%d'))
        Rake::Task["stats:import_all"].invoke(args[:date_start], args[:date_end])
        Rake::Task["update_daily_stats:by_date"].invoke(args[:date_start])
      end
    end
    

    当您尝试这样做时:

    args[:date_start] = DateTime.yesterday.strftime('%Y-%m-%d')
    

    实际发生的是:

    args.[]=(:date_start, DateTime.yesterday.strftime('%Y-%m-%d'))
    

    (它调用方法[]=

    由于TaskArguments 没有定义[]= 方法,它的method_missing 被调用,它试图找到名为:[]= 的参数的值:

    def method_missing(sym, *args)
      lookup(sym.to_sym)
    end
    

    这解释了为什么值没有改变,但你没有得到任何异常......

    【讨论】:

    • 这样做的原因是因为 params 哈希包含一个空字符串并且 ||= 如果 left 为 nil right 有效?
    • 原因是因为args不是hash,而是TaskArguments实例。如果该值为空字符串,则 OP 建议的第二种方法也不起作用。
    【解决方案2】:

    和这个是一样的

    nil ||= DateTime.yesterday.strftime('%Y-%m-%d')
    

    您不能将任何内容分配给 NilClass 的实例。这就是您的第二个选项有效的原因。

    date_start = args[:date_start] || DateTime.yesterday.strftime('%Y-%m-%d')
    

    这里有一个要创建的变量,如果 args[:date_start] 为 nil,则继续取昨天的日期。

    【讨论】:

    • 这将导致错误 (Can't assign to nil) - 这不是 OP 所描述的......
    • ||= 运算符也可用于在哈希上分配值。你的假设是错误的,因此整个答案都是错误的。这里真正的问题是args 不是哈希。
    • 我有 - 值保持为零,没有报告异常 - rake task with assignment ||= coming back nil 您的代码引发异常 - 它没有解释 OP 会发生什么。如果你好奇,可以阅读我的回答,看看实际发生了什么。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-09-15
    • 1970-01-01
    • 2015-11-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-24
    相关资源
    最近更新 更多