0

我刚刚意识到,当我使用 after_commit 过滤器时,它似乎执行了两次函数(我不知道的原因)

控制器:

def new
    @upload_files = UploadFiles.new
    respond_to do |format|
      format.html # new.html.erb
      format.json { render json: @upload_files }
    end
  end

  # GET /uploads/1/edit
  def edit
    @uploadFiles = Upload.find(params[:id])
  end

  # POST /uploads
  # POST /uploads.json
  def create
    @upload_files = UploadFiles.create(params[:upload_files])
    respond_to do |format|
      if @upload_files.save
        redirect_to @upload_files
      else
        format.html { render action: "new" }
        format.json { render json: @upload_files.errors, status: :unprocessable_entity }
      end
    end
  end

模板:

<%= csrf_meta_tags %>
<%= form_for :upload_files, :url => upload_files_path, :html => { :multipart => true } do |f| %>
<h4>Upload Inventory</h4>
<div><%= f.file_field :inventory %></div>
<h4>Upload Material List</h4>
<div><%= f.file_field :material_list %></div>
&nbsp;
<div align="center">
    <%= f.submit "Upload" %>
</div>
<% end %>

class UploadFiles < ActiveRecord::Base
  after_save :process_files

def process_files
    @init_process=Time.now
    out_file = File.new("times.txt", "w")
    out_file.puts("Init Time")
    out_file.puts(Time.now)
    logger.info "Processing the request..."
    logger.info Time.now
    logger.info "Processing Files..."
    logger.info Time.now
.
.
.
end
end

日志:

Started POST "/upload_files" for 127.0.0.1 at 2013-10-17 10:20:06 -0430
Processing by UploadFilesController#create as HTML
  Parameters: {"utf8"=>"✓", "authenticity_token"=>"NpCyDUNq8uPwJMj2DofP4rHEZWYkfsIu68Wg+XqebNk=", "upload_files"=>{"inventory"=>#<ActionDispatch::Http::UploadedFile:0x4df7648 @original_filename="INV Onhand -753233-2013090621595800.xlsx", @content_type="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", @headers="Content-Disposition: form-data; name=\"upload_files[inventory]\"; filename=\"INV Onhand -753233-2013090621595800.xlsx\"\r\nContent-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet\r\n", @tempfile=#<File:C:/Users/V80042~1/AppData/Local/Temp/RackMultipart20131017-7356-1i1m655>>, "material_list"=>#<ActionDispatch::Http::UploadedFile:0x4df7408 @original_filename="Formato SCL Movistar1.xlsx", @content_type="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", @headers="Content-Disposition: form-data; name=\"upload_files[material_list]\"; filename=\"Formato SCL Movistar1.xlsx\"\r\nContent-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet\r\n", @tempfile=#<File:C:/Users/V80042~1/AppData/Local/Temp/RackMultipart20131017-7356-fqdioq>>}, "commit"=>"Upload"}
  [1m[35mUser Load (0.0ms)[0m  SELECT "users".* FROM "users" WHERE "users"."id" = 5 LIMIT 1
  [1m[36m (0.0ms)[0m  [1mbegin transaction[0m
Binary data inserted for `string` type on column `inventory_content_type`
Binary data inserted for `string` type on column `material_list_content_type`
  [1m[35mSQL (2.0ms)[0m  INSERT INTO "upload_files" ("created_at", "inventory_content_type", "inventory_file_name", "inventory_file_size", "inventory_updated_at", "material_list_content_type", "material_list_file_name", "material_list_file_size", "material_list_updated_at", "updated_at") VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)  [["created_at", Thu, 17 Oct 2013 14:50:06 UTC +00:00], ["inventory_content_type", "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"], ["inventory_file_name", "INV_Onhand_-753233-2013090621595800.xlsx"], ["inventory_file_size", 6776337], ["inventory_updated_at", Thu, 17 Oct 2013 14:50:06 UTC +00:00], ["material_list_content_type", "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"], ["material_list_file_name", "Formato_SCL_Movistar1.xlsx"], ["material_list_file_size", 42608], ["material_list_updated_at", Thu, 17 Oct 2013 14:50:06 UTC +00:00], ["updated_at", Thu, 17 Oct 2013 14:50:06 UTC +00:00]]
  [1m[36m (4.0ms)[0m  [1mcommit transaction[0m
Processing the request...
2013-10-17 10:20:07 -0430
Processing Files...
2013-10-17 10:20:07 -0430
Inventory Opened...
2013-10-17 10:21:47 -0430
Material List Opened...
2013-10-17 10:21:48 -0430
Default Sheets were set...
Output file created...
2013-10-17 10:21:48 -0430
Code and Name read...
2013-10-17 10:21:48 -0430
Beginning Inventory reading...
2013-10-17 10:21:48 -0430
Inventory completely read...
2013-10-17 10:57:54 -0430
Total Time reading and Parsing Inventory...
2013-10-17 10:57:54 -0430
Output file created...
2013-10-17 10:58:00 -0430
Process Finished...
2013-10-17 10:58:00 -0430
  [1m[35m (1095.0ms)[0m  begin transaction
  [1m[36m (19.0ms)[0m  [1mcommit transaction[0m
Processing the request...
2013-10-17 10:58:03 -0430
Processing Files...
2013-10-17 10:58:03 -0430
failed to allocate memory
Redirected to http://localhost:3000/upload_files/157
Completed 406 Not Acceptable in 2293951ms (ActiveRecord: 1124.0ms)

该文件显然太大了,它会抛出无法分配内存,但如果不是,我很确定它会再次执行它......

为什么它再次执行它?

我尝试使用 after_create 和 after_save 但它抛出一个异常,说 .xlsx 文件不存在。

4

1 回答 1

1

假设我正确理解了您的意思,您在控制器的create操作中进行了多次保存,因为两者都UploadFiles.create触发@upload_files.save了数据库操作。

也许你的意思是UploadFiles.new

于 2013-10-17T19:16:44.450 回答