Это происходит из-за того, что вы модифицируете массив, для которого вы выполняете итерацию.
Что-то вроде этого должно работать
array.clone.each { |item|
array.delete("#{item}") if flash[:"#{item}"]
}
Попробуйте запустить его с * 1005 и без * на вводе образца
array = ['notice', 'warning', 'error']
flash = {:warning => 1, :error => 2}
...
p array
Но нет необходимости вызывать delete
вручную, вы можете просто использовать пользователя reject :
array = array.reject! { |item| flash[:"#{item}"] }