Система не хочет писать tmpfile в ruby ​​на рельсах? - PullRequest
1 голос
/ 04 ноября 2011

Я реализую в Ruby on Rails, и я хочу сделать так, чтобы, на мой взгляд, я просматривал файл (CSV-файл). который я прочитал в и положить его в TempFile. Затем во втором представлении я показываю, например, первые 5 строк. И затем в моем третьем представлении я хочу показать первые строки снова. Мой контроллер:

class ProjectImporterController < ApplicationController
  unloadable
  def index

    end
  end

def match   
   file = params[:file]


   @parsed_file=CSV::Reader.parse(file)
  sample_count = 5  

  @original_filename = file.original_filename
    tmpfile = Tempfile.new("redmine_user_importer")
    if tmpfile
      tmpfile.write(file.read)
      tmpfile.close
      tmpfilename = File.basename(tmpfile.path)
      if !$tmpfiles
        $tmpfiles = Hash.new
      end
      $tmpfiles[tmpfilename] = tmpfile
    else
      flash[:error] = "Cannot save import file."
      return
    end

    session[:importer_tmpfile] = tmpfilename

  i = 0
  @samples = []
     @parsed_file.each  do |row|

            if i != 0   
            @samples[i] = row
            end

            if i == 0
                @headers = row
            end


            if i >= sample_count 
                break
          end

        i = i+1 

     end
   end

   end

   def result
     tmpfilename = session[:importer_tmpfile]

      if tmpfilename
      tmpfile = $tmpfiles[tmpfilename]
      if tmpfile 
        flash[:error] = "Tempfile doesn't exist!"
        return
      end  


      @parsed_file=CSV::Reader.parse(tmpfile)
       @samples = []
     @parsed_file.each  do |row|

        if i != 0 
          @samples[i] = row
        end

        if i == 0
          @headers = row
        end


        if i >= sample_count 
          break
        end

        i = i+1

     end
   end
end

Теперь мой код для первого просмотра просто:

 <% form_tag({:action => 'match'}, {:multipart => true}) do %>
    <table">
       <tr>
         <td>
          <label for="dump_file">
            Select a CSV File :
          </label>
         </td>
         <td >
           <%= file_field_tag 'file', :size => 60%></p>
         </td>
       </tr>

     </table>

Второй и третий вид одинаковы:

<ul>
<% @samples.each do |a| %>
<li>
<%= a %>
</li>
<% end %>
</ul>

Это просто простой пример, но, с моей второй точки зрения, все работает, и система просто показывает первые результаты. Но в моем третьем представлении я получаю сообщение об ошибке: неопределенный метод `each 'для nil: NilClass. Так что @samples = ноль. Кто-нибудь, кто знает, что я делаю не так?

Спасибо

1 Ответ

0 голосов
/ 04 ноября 2011

Вы получите только имя файла без полного пути. Чтобы получить Путь к загруженному Tempfile, используйте это в действии, которое происходит после отправки формы:

tempfile=params[:file].tempfile.to_path.to_s

Это дает вам полный путь к загруженному файлу, чтобы вы могли открыть файл.

...