分配的佣金任务|| =回来零

时间:2014-06-20 16:04:53

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

为什么在我的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')

2 个答案:

答案 0 :(得分: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

解释了为什么值没有改变,但你没有得到任何例外......

答案 1 :(得分:-1)

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

您无法将任何内容分配给NilClass的实例。这就是你的第二个选择有效的原因。

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

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