相关疑难解决方法(0)

为什么循环中的Rake任务只执行一次?

我有连接到多个数据库的rails应用程序.我写了自定义rake任务,看起来像这样:

task :migrate_accounts_schema => [:environment] do |t|
  users = User.find :all, :conditions => ["state = 2"], :order => "id asc"
  users.each do |user|            
    if user.state == 2
      ActiveRecord::Base.establish_connection(
        :adapter  => "postgresql",
        :host     => user.database_host,
        :port     => user.database_port,
        :username => user.subdomain,
        :password => "#{user.database_password}",
        :database => user.database_name
      )
      Rake::Task["db:migrate"].invoke
    end
  end
end
Run Code Online (Sandbox Code Playgroud)

问题是任务执行db:仅针对users [0]用户(集合中的第一个用户)进行迁移并且没有错误,只是静默地停止...

这是rake --trace的输出

** Invoke app:migrate_accounts_schema (first_time)
** Invoke environment (first_time)
** Execute environment
** Execute app:migrate_accounts_schema    
** Invoke db:migrate (first_time)
** Invoke environment 
** Execute db:migrate
** …
Run Code Online (Sandbox Code Playgroud)

ruby rake

16
推荐指数
2
解决办法
3713
查看次数

使用Rspec测试rake任务不接受参数

根据Stephen Hagemann的这篇文章,我正试图为我的一个rake任务写一个Rspec测试.

lib/tasks/retry.rake:

namespace :retry do

  task :message, [:message_id] => [:environment] do |t, args|
    TextMessage.new.resend!(args[:message_id])
  end
end
Run Code Online (Sandbox Code Playgroud)

spec/tasks/retry_spec.rb:

require 'rails_helper'
require 'rake'

describe 'retry namespace rake task' do
  describe 'retry:message' do
    before do
      load File.expand_path("../../../lib/tasks/retry.rake", __FILE__)
      Rake::Task.define_task(:environment)
    end

    it 'should call the resend action on the message with the specified message_id' do
      message_id = "5"
      expect_any_instance_of(TextMessage).to receive(:resend!).with message_id
      Rake::Task["retry:message[#{message_id}]"].invoke
    end

  end
end
Run Code Online (Sandbox Code Playgroud)

但是,当我运行此测试时,我收到以下错误:

Don't know how to build task 'retry:message[5]'
Run Code Online (Sandbox Code Playgroud)

另一方面,当我运行没有参数的任务时:

Rake::Task["retry:message"].invoke
Run Code Online (Sandbox Code Playgroud)

我能够调用rake任务,但测试失败,因为没有message_id.

我将参数传递给rake任务的方式有什么问题? …

ruby rake rspec ruby-on-rails rake-task

5
推荐指数
2
解决办法
2128
查看次数

标签 统计

rake ×2

ruby ×2

rake-task ×1

rspec ×1

ruby-on-rails ×1