On 21 June 2011 22:11, Jen <jen.bot...@gmail.com> wrote:
> Hi Colin,
> I did try implementing your suggestion in a previous experiment, which game
> me the same result.
> If I click the 'save upload' button and have not
> selected a file to upload the application falls over with the same error as
> in my previous post. I need some way of checking whether file_field is
> blank, and if it is prompting the user to select a file.

It could not possibly give you exactly the same error on the same line
of code, as the test would have prevented that line from being
executed.  It may have been a similar error on a different line of
code.  As I said before you can test for the field blank or nil using
params[:upload].blank?

Colin

>
> I am not sure where in the process of attempting to submit a file this check
> needs to happen, though I assume it is before the post occurs.
>
> If this explanation is not clear enough please let me know and I will
> attempt to explain it better.
>
> I am not sure if the fact that I am not using a database impacts on this. As
> stated in my previous post the files are uploaded to a directory, then
> committed to a git repo.
>
> Thanks in advance for any further help,
> Jen.
>
> Note the code below does work, as long as a file is selected for upload.
> Controller code:
> def create
> repo = Grit::Repo.new("/home/resource_portal/website/public/data/upload")
> if !params[:upload].blank?
> #posts to the data model.
>    post = Upload.save(params[:upload]), (params[:message])
> puts "file uploaded"
> repo.commit_all(:message)
> render 'upload'
> else
> flash.now[:error] = "Please select a file to upload"
> redirect_to 'upload'
>  end
> end
> end
>
> On 21/06/11 20:26, Colin Law wrote:
>>
>> On 21 June 2011 19:14, Jen<jen.bot...@gmail.com>  wrote:
>>>
>>> Hi,
>>> I have been experimenting with the code from the replies to this post so
>>> far, but still can't achieve what I want. If a file is selected it is
>>> uploaded just fine. However if no file is selected the application spits
>>> out
>>> the following error:
>>> NoMethodError in UploadController#create
>>>
>>> undefined method `original_filename' for nil:NilClass
>>>
>>> Rails.root: /home/resource_portal/website
>>>
>>> Application Trace | Framework Trace | Full Trace
>>>
>>>
>>> rake-0.8.7/ruby/1.9.1/gems/activesupport-3.0.3/lib/active_support/whiny_nil.rb:48:in
>>> `method_missing'
>>> app/models/upload.rb:13:in `save'
>>> app/controllers/upload_controller.rb:13:in `create'
>>
>> You said that you have taken note of the previous replies, but looking
>> at the code in upload_controller.rb you have not tested
>> params[:upload] before calling Upload.save in the create action, which
>> was the point of your original question I think.  As I previously
>> suggested you need to use something like
>> if !params[:upload].blank?
>> to prevent save being called when params[:upload] is nil or empty.
>> What else you need to do in that action when it is empty I do not know
>> as I do not know the details of what you want to achieve.
>>
>> Colin
>>
>>>
>>> rake-0.8.7/ruby/1.9.1/gems/actionpack-3.0.3/lib/action_controller/metal/implicit_render.rb:4:in
>>> `send_action'
>>>
>>> rake-0.8.7/ruby/1.9.1/gems/actionpack-3.0.3/lib/abstract_controller/base.rb:151:in
>>> `process_action'
>>>
>>> rake-0.8.7/ruby/1.9.1/gems/actionpack-3.0.3/lib/action_controller/metal/rendering.rb:11:in
>>> `process_action'
>>>
>>> ...
>>>
>>> I'm guessing I therefore need to be able to validate whether there is
>>> something in 'file_field' before the post action happens, but I'm not
>>> sure
>>> how to do this. Any other suggestions would be great!
>>>
>>> Also Now I'm confused about the best place for this code to go. I was
>>> originally just putting one if statement in my controller, but as this is
>>> validation I guess it should go in the model.
>>>
>>> I should probably also point out that files are not being stored in a
>>> database. Instead I am using GIT to version them and keep track of their
>>> history.
>>> My current code is attached.
>>>
>>> Thanks,
>>> Jen.
>>>
>>>
>>> On 21/06/11 13:46, Chirag Singhal wrote:
>>>
>>> It would be better to delegate that job to Upload model.
>>> Then you could write something like this:
>>> #posts to the data model.
>>> post = Upload.new(params[:upload])
>>> if post.save
>>>   puts "file uploaded"
>>>   render 'upload'
>>>   repo.commit_all(params[:message])
>>> else
>>>   redirect_to 'upload'
>>> end
>>> --
>>> You received this message because you are subscribed to the Google Groups
>>> "Ruby on Rails: Talk" group.
>>> To view this discussion on the web visit
>>> https://groups.google.com/d/msg/rubyonrails-talk/-/74m04USkgCsJ.
>>> To post to this group, send email to rubyonrails-talk@googlegroups.com.
>>> To unsubscribe from this group, send email to
>>> rubyonrails-talk+unsubscr...@googlegroups.com.
>>> For more options, visit this group at
>>> http://groups.google.com/group/rubyonrails-talk?hl=en.
>>>
>>> --
>>> You received this message because you are subscribed to the Google Groups
>>> "Ruby on Rails: Talk" group.
>>> To post to this group, send email to rubyonrails-talk@googlegroups.com.
>>> To unsubscribe from this group, send email to
>>> rubyonrails-talk+unsubscr...@googlegroups.com.
>>> For more options, visit this group at
>>> http://groups.google.com/group/rubyonrails-talk?hl=en.
>>>
>
> --
> You received this message because you are subscribed to the Google Groups
> "Ruby on Rails: Talk" group.
> To post to this group, send email to rubyonrails-talk@googlegroups.com.
> To unsubscribe from this group, send email to
> rubyonrails-talk+unsubscr...@googlegroups.com.
> For more options, visit this group at
> http://groups.google.com/group/rubyonrails-talk?hl=en.
>
>

-- 
You received this message because you are subscribed to the Google Groups "Ruby 
on Rails: Talk" group.
To post to this group, send email to rubyonrails-talk@googlegroups.com.
To unsubscribe from this group, send email to 
rubyonrails-talk+unsubscr...@googlegroups.com.
For more options, visit this group at 
http://groups.google.com/group/rubyonrails-talk?hl=en.

Reply via email to