2016-04-22 19 views
0

carrierwaveでユーザーDBに保存されているファイルをアップロードしています。ファイルを更新した後、そのファイルを他の場所にコピーするアクションを呼び出す必要があります。私の問題は、私がそのアクションを呼び出すと、私はこのエラーが(Errno::EISDIR - Is a directory @ rb_sysopen)ですが、作成されたファイルを認識しないためですが、私がファイルを更新していればDBにあります(そして、updateではなく、うまくいきますが、ユーザーがアップロードしたときにのみファイルをコピーします)。ruby​​:ユーザーの更新後にエラーが発生しました

これは私の二つの作用、更新あり、および更新を実行した後COPY_FILE呼び出す:

def copy_file 

    require "fileutils" 
    my_dir = Dir['./public/'+current_user.personal_file_url.to_s] 
    my_dir.each do |filename| 
     # name = File.basename('data', '.xml')[0,4] 
     dest_folder = "./public/files/" 


     FileUtils.cp(filename, dest_folder + "data.xml") 
    # File.rename(filename, dest_folder + "/" + "data" + File.extname(filename)) 


    end 

    bat_file 

    #redirect_to personal_performance_path 

    end 

    # PATCH/PUT /users/1 
    # PATCH/PUT /users/1.json 


    def update #upload personal file 



    respond_to do |format| 
     if @user.update(user_params) 
     format.html { redirect_to :back, notice: 'File was sucessfully uploaded!' } 
     format.json { render :show, status: :ok, location: @user } 

     # copy_file #make a copy of the uploaded file in public/files/data.xml for running in the bat file 
     else 
     format.html { render :edit } 
     format.json { render json: @user.errors, status: :unprocessable_entity } 
     end 

    end 

copy_file 

    end 
+0

なぜ、あなたは 'tempfile'にコピーして、あなたが望むファイルにTempfileをコピーして、それを削除するために一時ファイルを' .unlink'しないのですか?これはパフォーマンスを節約し、エラーも取り除きます。そのエラーはそのファイルがファイルではないことを意味します。どのような理由であれ、Rubyはあなたのファイルをディレクトリとして読み込み、それをコピーしません。 'tempfile'ソリューションを試して、それがどのように動作するかを見てください。また、 'FileUtils.cp'は実際には何もしません。http://ruby-doc.org/stdlib-1.9.3/libdoc/fileutils/rdoc/FileUtils.html – 13aal

+0

私がそれを呼び出すと、この動作は機能しています。ユーザーが更新された後の他の場所から – terrorista

+0

どうすればその一時ファイルの方法を行うことができますか? – terrorista

答えて

0

TempFileの方法:あなたがこれにいくつかの方法を行うことができます

、私が好ましく作成しますモジュールを作成するには、次の操作を行います。

require 'tempfile' 

module Temp 

    def copy_file(file1, file2) 
    file = TempFile.new(file1) #<= name your temp file 
    # the easiest way to do this is just to open the files and append to them 
    File.open(file2).each_line do |s| 
     File.open(file) { |tmp| tmp.puts(s) } 
     # you can choose to either truncate file2 or delete depending on what you need to do, you could also give it another argument in order to write to another file etc.. 
    end 
    file.unlink #<= delete the tempfile 
    end 
end 

Temp.copy_file('test', 'example.txt') 

これは、一時ファイルを使用する基本的な理解です

コピーモジュールの例は次のとおりです。thisに一時ファイルを簡単に統合できます。

+0

私はなぜ '初期化されていない定数UsersController :: TempFile'を取得しているのかわかりません、私は 'tempfile'が必要です – terrorista

+0

いくつかの調査の後、私はこれを見つけました:https://hackhands.com/rails-nameerror-uninitialized-constant-class-solution/ – 13aal

+0

はい私はそれを試みたが、同じ:/ – terrorista

関連する問題