File is nil


#1

I don’t understand why my program does not get the file that I try to
upload.
It returns the following error when I try to upload a small file:

NoMethodError in LogfileController#create

You have a nil object when you didn’t expect it!
The error occured while evaluating nil.original_filename

#{RAILS_ROOT}/app/models/logfile.rb:9:in file=' #{RAILS_ROOT}/app/controllers/logfile_controller.rb:31:increate’

Request
Parameters: {“logfile”=> {“fileName”=>#StringIO:0x39c3fc0},
“commit”=>“Create”}

This is the code in view:

<%= form_tag({:action => ‘simple_save’},
{:method => “post”, :multipart => true}) %>

<%= submit_tag “Simple Save” %>
<%= end_form_tag %>

This is the code in the controller:

def create

@logfile.file= @params[‘logfile_fileName’]

end

And the Model is nearly identical to the code in here:

http://www.bigbold.com/snippets/posts/show/1805

Is it because I don’t have a file field in my database? The database
keeps the name of the file and some information related to it. I want
to save the file locally only, not to the database.

Please help! I’ve been stuck for DAYS.

Thank you in advance.


#2

Oh. My. Goodness.

What was missing was the the length of character input the html.
So I went overboard with the input size.

My view now reads:


#3

Hi –

On Wed, 7 Jun 2006, Lisa wrote:

#{RAILS_ROOT}/app/controllers/logfile_controller.rb:31:in `create’

Request
Parameters: {“logfile”=> {“fileName”=>#StringIO:0x39c3fc0},
“commit”=>“Create”}
[…]
@logfile.file= @params[‘logfile_fileName’]

Those don’t match. Try:

@logfile.file = params[‘logfile’][‘fileName’]

David


David A. Black (removed_email_address@domain.invalid)


#4

Here’s your problem:

2006/6/7, Lisa removed_email_address@domain.invalid:

Request
Parameters: {“logfile”=> {“fileName”=>#StringIO:0x39c3fc0},
“commit”=>“Create”}

  @logfile.file= params['logfile_fileName']

You’re tring to access the ‘logfile_fileName’ key of params, but
params only has a ‘logfile’ and a ‘commit’ key. But, the param
‘logfile’ is itself a hash, with a key ‘fileName’, so what you really
want is:

@logfile.file= params[‘logfile’][‘fileName’]

When you have an underscore in the param name, Rails groups the params
by prefix. Here, the prefix is ‘logfile’, so you get a hash saved
under ‘logfile’ with all the params which start ‘logfile_’, rather
than accessing the params ‘logfile’ itself.

This is especially useful when, say, you want to create two model
objects, and you want to initialise them from a hash. This way you can
have fileds ‘alpha_name’, ‘alpha_address’ and ‘beta_name’ and
‘beta_age’, which will give you two hashes, params[‘alpha’] and
params[‘beta’]. Have a look in the documentation under form helpers to
learn more about how this works.

hth,
Douglas


#5

Thank you all so much!

Everyone in the Ruby community has been so helpful.

I have to admit this is scaffold withdrawal, but I honestly tried to
read the documentation (I just didn’t know where to start). Much of it
is still magic and mystics to me, but I hope to become better at it.

Thanks again.

Lisa


#6

It’s not @params['logfile_fileName'] but
params[:logfile]["fileName"]