Ruby on rails Don';如果引发错误,则不能停止rake任务

Ruby on rails Don';如果引发错误,则不能停止rake任务,ruby-on-rails,ruby,rake,Ruby On Rails,Ruby,Rake,我有一个简单的rake文件。 它将数据从.xls文件导入数据库。 但有些数据是无效的。然后数据是无效的rake停止执行脚本。 但我想跳过这一行,试试下一行 我的部分代码: data.each do |row| username = row[0].slice!(0..2) + row[1].slice!(0..2) + rand(100).to_s username.downcase password = "pass1234" User.create!( email: row[2].do

我有一个简单的rake文件。 它将数据从
.xls
文件导入数据库。 但有些数据是无效的。然后数据是无效的rake停止执行脚本。 但我想跳过这一行,试试下一行

我的部分代码:

data.each do |row|

username = row[0].slice!(0..2) + row[1].slice!(0..2) + rand(100).to_s
username.downcase
password = "pass1234"
User.create!(
    email: row[2].downcase,
    username: username,
    first_name: row[0],
    last_name: row[1],
    expiration_date: row[3],
    password: password,
    password_confirmation: password)
p 'done'
结束

错误与验证有关,例如:

rake aborted!
ActiveRecord::RecordInvalid: Validation failed: Expiration date must be after 2015-10-27

脚本已停止,且未添加有效记录。

将其包装在开始/救援块中

data.each do |row|
  begin 
    username = row[0].slice!(0..2) + row[1].slice!(0..2) + rand(100).to_s
    username.downcase
    password = "pass1234"
    User.create!(
        email: row[2].downcase,
        username: username,
        first_name: row[0],
        last_name: row[1],
        expiration_date: row[3],
        password: password,
        password_confirmation: password)
    p 'done'
  rescue => e
    # log exception or ignore it.
  end 
end 
请注意,这是因为默认的救援是针对StandardError的。因为ActiveRecord::RecordInvalid 如果您只想处理这些特定的错误,那么可以首先挽救特定的错误

(参考请参见API:)