0

file_field でファイルを選択しようとすると、ファイルが「nil」であるというエラーが表示されます。エラーは次のとおりです。「そのようなファイルまたはディレクトリはありません - Book1.csv」

理由がわかりますか?以下にコードを示します。

コントローラ

def import_csv
@list = List.find(params[:list_id])
@lists = List.all

respond_to do |format|

@csv_text = File.read(params[:list][:file])
@csv = CSV.parse(@csv_text, :headers => true)
@n=0
@csv.each do | row |
  @user_new = User.new
  @user_new.first_name = row[0]
  @user_new.last_name = row[1]
  @user_new.email = row[2]
  @user_new.company = row[3]
  @user_new.address = row[4]
  @user_new.city = row[5]
  @user_new.state = row[6]
  @user_new.zipcode = row[7]
  @user_new.country = row[8]
  @user_new.notes = row[9]
  @user_new.birthday = row[10]
  @user_new.home_number = row[11]
  @user_new.mobile_number = row[12]
  @user_new.list_id = @list.id
  @user_new.save

  @list.subscribers += 1
  @list.save
  @n=@n+1
  GC.start if @n%50==0
  flash[:notice] = "CSV Imported Successfully, with  #{@n} records"                                
end

  format.html { redirect_to lists_url }
  format.json { head :no_content }
end
  end

見る

<%= form_for(:list, :url => list_import_csv_path(@list), :method => :get, :html => {:multipart => true}) do |f| %>
 <table>
    <tr>
        <td><label for="dump_file">Select a CSV File :</label></td>
        <td><%= f.file_field :file %></td>
    </tr>
    <tr>
        <td colspan='2'><%= submit_tag 'Import from CSV file' %></td>
    </tr>
</table>
<% end %>
4

2 に答える 2

2

ActionDispatch::Http::UploadedFileこれは、オブジェクトを実際のパスではなくパスとして渡そうとするためです。あなたがやる:

@csv_text = File.read(params[:list][:file])

やったほうがいい:

@csv_text = File.read(params[:list][:file].tempfile.to_path.to_s)

:method => :getまた、それほど小さくないファイルをアップロードするときに使用する問題かもしれません. 一般に、GET とファイル アップロードはそれほど優れた組み合わせではありません。^^

于 2012-07-16T23:11:49.693 に答える