簡體   English   中英

使用ruby 1.9.2和rails 3,如何收集activerecord錯誤以供以后顯示? 還是更好,推遲提交直到准備好?

[英]Using ruby 1.9.2 and rails 3, how do I collect activerecord errors to display later? Or better yet, hold off on the commit until ready?

在一次操作中,我將多行插入到表中。 這些行中的一個或多個可能導致ActiveRecord :: RecordInvalid問題。 發生這種情況時,我希望能夠撤消該特定操作的所有事務,並讓用戶在繼續操作之前先修復數據。 這樣做的最佳方法是什么?

現在,如果第二行數據失敗,則第一行數據已經提交到數據庫,因此用戶將不知道是否應該重新加載第一行。 我可以告訴用戶成功的行數是多少,他們可以知道僅從該部分開始進行修復和重新加載,但是如果我可以撤消所有操作並讓用戶在修復數據后重新開始,那對我來說會更好。

僅供參考,用戶最初將CSV文件加載到一個表中,該表包含其csv文件的每一行*每一行的行,並且我從該import_table導入。

這是我的控制器方法的一部分:

  def process_import

    @import = ImportTable.find(params[:id])
    @cells = @import.import_cells
    @new_donors = Array.new
    @existing_donors = Array.new
    class_name = 'Donor'          

    klass = ActiveRecord.const_get(class_name) # get access to class

    #loop through rows
    0.upto(@import.row_count - 1) do |row_index|
      donor = {}
      donation = {} 
      record_status = 'new'     
      row = @cells.select { |cell| cell.row_index == row_index }

      #loop through columns
      0.upto(@import.column_count - 1) do |column_index|
        contents = row.select { |cell| cell.column_index == column_index}[0].contents

        case column_index
          when 0 then   record_status = contents
          when 1 then   donor["id"] = contents
          when 2 then   donor["prefix1"] = contents
          when 3 then   donor["first_name1"] = contents
          when 4 then   donor["middle_name1"] = contents
          ...
        end #case
      end #columns

      unless @donor = Donor.find_by_id(donor["id"])
        donor.delete("id")
        @donor = klass.find_or_initialize_by_company_and_prefix1_and_first_name1_and_last_name1_and_address1(donor) 
      end

      @donor.new_record? ? @new_donors.push(@donor) : @existing_donors.push(@donor)    
      @donor.save!

      if !donation["amount"].blank?
        @donation = @donor.donations.build(donation)
        @donation.save!

        end

    end #rows


   @import.processed_date = Time.now
   @import.save

  end

我只是讓用戶重新提交整個數據

將導入過程包裝在事務中。 如果發生錯誤,則可以通過引發ActiveRecord::Rollback退出整個提交

klass.transaction do
  # loop through rows
  # You might want to call @donor.save rather than @donor.save! so that you do not raise errors, yet still have invalid records.

  raise ActiveRecord::Rollback if (@new_donors+@existing_donors).any?{|donor| !donor.valid? }
end

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM