2014-05-13 3 views
1

J'essaie de suivre this tutorial. Il a écrit dans la version précédente de Rails et je suis en utilisant Rails 4. Je suis en train de télécharger le fichier mais je reçois l'erreur suivante:Ruby Rails: Télécharger le fichier

NoMethodError in UploadController#uploadfile 
undefined method `[]' for nil:NilClass 

Extracted source (around line #3): 

class DataFile < ActiveRecord::Base 
    def self.save(upload) 
    name = upload['datafile'].original_filename 
    directory = "public/data" 
    # create the file path 
    path = File.join(directory, name) 

Rails.root: C:/Ruby193/mylibrary 

Application Trace | Framework Trace | Full Trace 
app/models/data_file.rb:3:in `save' 
app/controllers/upload_controller.rb:6:in `uploadfile' 

est ici data_file.rb

class DataFile < ActiveRecord::Base 
    def self.save(upload) 
    name = upload['datafile'].original_filename 
    directory = "public/data" 
    # create the file path 
    path = File.join(directory, name) 
    # write the file 
    File.open(path, "wb") { |f| f.write(upload['datafile'].read) } 
    end 
end 

Voici contrôleur upload_controller.rb

class UploadController < ApplicationController 
    def index 
    render :file => 'app\views\upload\uploadfile.html' 
    end 
    def uploadfile 
    post = DataFile.save(params[:upload]) 
    render :text => "File has been uploaded successfully" 
    end 
end 

est ici uploadfile.html

<h1>File Upload</h1> 
<%= form_tag({:action => 'uploadfile'}, :multipart => true) do %> 
<p><label for="upload_file">Select File</label> 
    <%= file_field 'upload', 'datafile' %></p> 
<%= submit_tag "Upload" %> 
<% end %> 

Que dois-je faire? Merci d'avance

+0

Ce formulaire ne devrait-il pas être en plusieurs parties? –

+0

Il s'agit d'un formulaire en plusieurs parties dans le tutoriel, et vous ne pouvez pas télécharger des fichiers sans un formulaire en plusieurs parties, alors oui. Je devrais être multipart. –

Répondre

1

Il semble que params [: upload] ne soit pas ce que vous pensez. Vous avez oublié de définir le formulaire comme multipart. Si la réparation ne fonctionne pas, commencez à inspecter les paramètres pour voir ce que vous obtenez réellement.

def uploadfile 
    puts params.inspect # Add this line to see what's going on 
    post = DataFile.save(params[:upload]) 
    render :text => "File has been uploaded successfully" 
end 

En outre, ce n'est pas une grande « réponse », mais j'ai eu un bon succès en utilisant paperclip pour gérer le téléchargement de fichiers. Si vous voulez juste quelque chose qui fonctionne (plutôt que d'apprendre comment le faire vous-même), vérifiez cela.

Questions connexes