2016-07-19 4 views
0

Ich importiere eine Datei mit SmarterCSV und ich habe eine Funktion, die bestimmte Aspekte der Datei überprüft und Sie dann umleitet und die Ergebnisse anzeigt.Schienen 4: Überprüfen Sie die Datei und importieren Sie sie, wenn die Bedingungen erfüllt sind

Ich möchte, dass diese Anzeige auch eine Schaltfläche enthält, die "Import" enthält, mit der Sie die gleiche Datei importieren können, solange Sie mit dem Angezeigten zufrieden sind.

Wie kann ich die Datei nach der Weiterleitung an die zweite Funktion übergeben, ohne die Datei erneut auswählen zu müssen?

# validate file and check display 
def check_file 
    @success, @error = Timecard.check_timecard(params[:file]) 
    redirect_to timecards_path, notice: [@success, @error] 
end 

#import into database if display is satisfactory 
def bulk_upload 
    x = Timecard.import(params[:file]) 
    redirect_to timecards_path, notice: "Times imported successfully." 
end 

#view showing display 
<% if flash[:notice].is_a? String %> 
    <%= flash[:notice] %> 
<% elsif flash[:notice].is_a? Array %> 
    <div class="container"> 
     <div class="col-xs-10 col-xs-offset-1"> 
      <table class="table table-hover table-striped table-bordered"> 
       <thead> 
        <tr> 
         <th>Name</th> 
         <th>Regular</th> 
         <th>Overtime</th> 
         <th>Sick</th> 
         <th>Vacation</th> 
         <th>Holiday</th> 
        </tr> 
       </thead> 
       <tbody> 
        <% notice[0].each do |success| %> 
        <tr> 
         <td style="color: green"><%= success[0] %></td> 
         <% success[1].each do |type| %> 
         <td><%= type %></td> 
         <% end %> 
        </tr> 
        <% end %> 
        <% notice[1].each do |failure| %> 
        <tr> 
         <td style="color: red"><%= failure[0] %></td> 
         <td><%= success[1] %></td> 
        </tr> 
        <% end %> 
       </tbody> 
      </table> 
     </div> 

     <div class="container-fluid"> 
      <div class="col-xs-12 col-md-6 col-md-offset-3 text-xs-center"> 
       <div class="card card-nav-tabs"> 
        <div class="header header-info"> 
         Import Timecard and Send Email 
        </div> 
        <div class="content"> 

         <!-- IMPORT GOES HERE --> 

        </div> 
       </div> 
      </div> 
     </div> 
    </div> 
<% end %> 

Antwort

0

Es gibt eine nette Möglichkeit, dies zu tun. Sie sollten die Datei an einen Speicherort innerhalb Ihrer Anwendung verschieben und dann den Pfad der Datei in der Datenbank für den Datensatz speichern, in den Sie diese Datei hochladen möchten. Betrachten Sie das folgende Beispiel. Unter der Annahme, das Sie hochladen, diese Datei zu einem Timecard Datensatz und eine Instanz existiert als @time_card

name = params[:upload][:file].original_filename 
directory = "public/images/upload" 
path = File.join(directory, name) 
File.open(path, "wb") { |f| f.write(params[:upload][:file].read) } 

@time_card.csv_path = path 

Dann leiten Sie den Benutzer auf die Validierung Fehlerseite. Dann, nach Gebrauch der Seite einreicht können Sie die CSV importieren Sie die Datei in @ time_card.csv_path mit

+0

Ich denke Im ein wenig verwirrt darüber, wie Sie den obigen Code zu implementieren –

+0

Ich habe es die Datei zu speichern, aber die Datei es speichert ist leer. Mit anderen Worten, der Inhalt der ursprünglichen Datei wird nicht geschrieben –

+0

Ich habe festgestellt, dass diese Lösung funktioniert hat: 'tmp = params [: mein_Dateifeld] .tempfile destination_file = Datei.join ('public', 'uploads', params [: my_file_field] .original_filename) FileUtils.move tmp.path, Schicksal_Datei' –

Verwandte Themen