我正在使用ruby的文件打开并读取rake任务中的文本文件.是否有一个设置,我可以指定我想要跳过文件的第一行?到目前为止,这是我的代码:
desc "Import users."
task :import_users => :environment do
File.open("users.txt", "r", '\r').each do |line|
id, name, age, email = line.strip.split(',')
u = User.new(:id => id, :name => name, :age => age, :email => email)
u.save
end
end
Run Code Online (Sandbox Code Playgroud)
我想line.lineno,也这样做File.open("users.txt", "r", '\r').each do |line, index|,并next if index == 0但没有任何运气.
我有兴趣运行一个非常长时间运行的rake任务,这个任务需要几个小时才能完成,我有兴趣了解处理这个问题的最佳实践.
我找到的可能的解决方案:
cron似乎是一个简单的设置解决方案,但它是否适合长期任务?您使用什么以及您的解决方案的优点/缺点是什么?
我有一个额外的空格字符串:
First,Last,Email ,Mobile Phone ,Company,Title ,Street,City,State,Zip,Country, Birthday,Gender ,Contact Type
Run Code Online (Sandbox Code Playgroud)
我想解析这一行并删除空格.
我的代码看起来像:
namespace :db do
task :populate_contacts_csv => :environment do
require 'csv'
csv_text = File.read('file_upload_example.csv')
csv = CSV.parse(csv_text, :headers => true)
csv.each do |row|
puts "First Name: #{row['First']} \nLast Name: #{row['Last']} \nEmail: #{row['Email']}"
end
end
end
Run Code Online (Sandbox Code Playgroud) 在我的Rails应用程序中,我有一个文件sample_data.rb内部/lib/tasks以及我/spec目录中的一堆测试文件.
所有这些文件通常共享通用功能,例如:
def random_address
[Faker::Address.street_address, Faker::Address.city].join("\n")
end
Run Code Online (Sandbox Code Playgroud)
我应该把这些辅助功能放在哪里?对此有什么约定吗?
谢谢你的帮助!
ruby rake-task ruby-on-rails-3 ruby-on-rails-3.1 ruby-on-rails-3.2
我想在我的rake任务中使用ActionMailer,以便在特定时间向人们发送电子邮件.
我在app/mailers文件夹中编写了一个邮件程序类,如下所示:
class AlertsMailer < ActionMailer::Base
default from: 'x@y.com'
def mail_alert(email_addresses, subject, url)
@url = '#{url}'
mail(to: email_addresses, subject: 'Alert') do |format|
format.html { render '/alerts/list' }
end
end
end
Run Code Online (Sandbox Code Playgroud)
然后我在rake任务中包含以下行:
AlertsMailer.mail_alert(email_addresses, subject)
Run Code Online (Sandbox Code Playgroud)
当我尝试运行rake任务时:
rake update_db
Run Code Online (Sandbox Code Playgroud)
我收到以下错误:
uninitialized constant AlertsMailer
Run Code Online (Sandbox Code Playgroud)
我想我必须以某种方式在我的rake任务中加载邮件程序类,但我不知道如何做到这一点.
请帮忙.
1 namespace :db do
2 desc "Fill database with sample videos"
3 task :populate => :environment do
4 require 'faker'
5 Rake::Task['db:reset'].invoke
6 100.times do |n|
7 headline = Faker::Lorem.sentence(3)
8 video = Faker::Lorem.words(5)
9 Video.create!(:headline => headline,
10 :video => video)
11 end
12 end
13 end
Run Code Online (Sandbox Code Playgroud)
我目前在lib/tasks/sample_data.rb中有这个rake任务
跑步时rake db:populate我得到错误,Don't know how to build task 'db:populate'.我该如何解决这个问题?
注意:我是Rails/Ruby的新手.我正在使用Rails 3.
我想测试rake任务中定义的方法.
耙文件
#lib/tasks/simple_task.rake
namespace :xyz do
task :simple_task => :environment do
begin
if task_needs_to_run?
puts "Lets run this..."
#some code which I don't wish to test
...
end
end
end
def task_needs_to_run?
# code that needs testing
return 2 > 1
end
end
Run Code Online (Sandbox Code Playgroud)
现在,我想task_needs_to_run?在测试文件中测试这个方法我该怎么做?
附加说明:理想情况下,我希望在rake任务中测试另一个私有方法......但我可以稍后再担心.
我正在尝试创建一个rake任务,它接受一个必需的第一个参数,然后我想把它们组合成一个数组的任意数量的附加参数:
rake course["COURSE NAME", 123, 456, 789]
Run Code Online (Sandbox Code Playgroud)
我尝试了以下但args[:numbers]只是一个字符串w/123而不是所有的数字.
task :course, [:name, *:numbers] => :environment do |t, args|
puts args # {:name=>"COURSE NAME", :numbers=>"123"}
end
Run Code Online (Sandbox Code Playgroud) 是否有可能以某种方式执行rake任务只有它还没有运行,我想使用cron执行一些rake任务但是rake任务不应该在前一次调用未完成时启动谢谢
作为指南,用于准备测试数据库的命令是
bundle exec rake db:test:prepare
Run Code Online (Sandbox Code Playgroud)
但是,我发现以下命令也适用于我并为我创建了测试数据库.
bundle exec rake test:prepare
Run Code Online (Sandbox Code Playgroud)
如果是的话,想知道这是否是一个有效的命令.我在哪里可以找到文档.
测试 rails 3.2.8
rake-task ×10
rake ×6
ruby ×6
actionmailer ×1
csv ×1
delayed-job ×1
parsing ×1
ruby-1.9.3 ×1
testing ×1
unit-testing ×1