如果引发错误,请不要停止rake任务

Jen*_*sky 3 ruby rake ruby-on-rails

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

我的部分代码:

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'
Run Code Online (Sandbox Code Playgroud)

结束

错误是关于验证,例如:

rake aborted!
ActiveRecord::RecordInvalid: Validation failed: Expiration date must be after 2015-10-27
Run Code Online (Sandbox Code Playgroud)

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

Bry*_*mar 5

将其包裹在开始/救援区块中.

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 
Run Code Online (Sandbox Code Playgroud)

请注意,这是有效的,因为默认救援是针对StandardError的.自ActiveRecord :: RecordInvalid <StandardError.它将被"捕获".

如果您只想对这些特定错误执行某些操作,则可以先抢救特定错误.

(另请参阅API:http://ruby-doc.org/core-2.2.0/Exception.html)