Forum: Ruby on Rails Uploading Images

Announcement (2017-05-07): www.ruby-forum.com is now read-only since I unfortunately do not have the time to support and maintain the forum any more. Please see rubyonrails.org/community and ruby-lang.org/en/community for other Rails- und Ruby-related community platforms.
64e445650d4b18f643e227fa64146483?d=identicon&s=25 Ali (Guest)
on 2007-03-13 17:54
(Received via mailing list)
Hi all,

I'm trying to do a file upload.  I have followed the examples in Agile
Web Development with Rails, and Rails Cookbook, and I can't get it to
work!!   The following code is from the Rails Cookbook.  I have two
tables: Items & Photos.  It's supposed to save Name and Description
into the Items table, and then grab the photo information and put it
in the Photo table.  The Item information is saving, but I'm blowing
up in the Photo Model.  It doesn't recognize the field names for the
Photo table and also doesn't recognize the "read" attribute for the
image.  Any idea what I'm missing??  As always, any and all help is
greatly appreciated!!!  Thanks!  ~Ali

ITEMS CONTROLLER

def new
end

  def create
    @item = Item.new(params[:item])

    # I don't understand this part -- how can it ever get past here???
I tried commenting it out, but still won't work.
    if @item.save
      flash[:error] = 'Problem Uploading'
      redirect_to :action => 'new'
      return
    end

    @photo = Photo.new(params[:photo])
    @photo.item_id = @item.id

    if @photo.save
      flash[:notice] = 'Item was successfully created.'
      redirect_to :action => 'list'
    else
      flash[:error] = 'There was a problem.'
      render :action => 'new'
    end
  end

ITEMS MODEL

class Item < ActiveRecord::Base
  has_many :photos
end

PHOTOS MODEL

class Photo < ActiveRecord::Base

  belongs_to :item, :foreign_key => "item_id"

  def photo=(image_field)
    self.name = base_part_of(image_field.original_filename)
    self.content_type = image_field.content_type.chomp
    self.data = image_field.read
  end

  def base_part_of(file_name)
    name = File.basename(file_name)
    name.gsub(/[^\w._-]/, '')
  end

end

ITEM/_FORM

<div class="errorExplanation p"><%= flash[:error] %></div>

<!--[form:item]-->

<p><label for="item_name">Name</label><br/>
<%= text_field 'item', 'name'  %></p>

<p><label for="item_description">Description</label><br/>
<%= text_field 'item', 'description'  %></p>

<p><label for="photo">Photo</label><br/>
<%= file_field('photo', 'photo') %></p>

<!--[eoform:item]-->


ITEM/NEW

<h1>New Item</h1>

<%= start_form_tag :action => 'create', :id => @item, :multipart =>
true %>
  <%= render :partial => 'form' %>
  <%= submit_tag "Create" %>
<%= end_form_tag %>
64e445650d4b18f643e227fa64146483?d=identicon&s=25 Ali (Guest)
on 2007-03-15 17:18
(Received via mailing list)
Hi again,
No one has responded to my post and I'm wondering if I worded it in a
confusing way?  I really need some help with this.  I have been
scouring books and the web to no avail.  If further clarification is
needed, please ask!  I would really appreciate any suggestions!!

Thanks again!!
~Ali
D0cd6b10e01bacb976b3b815a9c660bc?d=identicon&s=25 Alex Wayne (squeegy)
on 2007-03-15 18:59
Ali wrote:
> Hi again,
> No one has responded to my post and I'm wondering if I worded it in a
> confusing way?  I really need some help with this.  I have been
> scouring books and the web to no avail.  If further clarification is
> needed, please ask!  I would really appreciate any suggestions!!
>
> Thanks again!!
> ~Ali

What does your HTML form tag look like?  I think your form tag is funky
since :multipart => true is being considered part of the url.  If so
your form tag would look like:

  <form action="/foo/create/123?multipart=true">

But you need it to be

  <form action="/foo/create/123" enctype="multipart/form-data">

You do that with form tag like this, so that the :multipart key is not
part of the url hash:

  <%= form_tag({:action => 'create', :id => @item}, {:multipart =>
true}) %>

This way the multipart is passed in as a second hash rather than tacked
onto the first.
744b6438d1457d332d1a8d431cc2b641?d=identicon&s=25 andrew.ohnstad@gmail.com (Guest)
on 2007-03-15 19:37
(Received via mailing list)
On Mar 13, 11:52 am, "Ali" <awilli...@washoecounty.us> wrote:

>
Yeah, this is a problem.  Look at what you have here...

"If the item is successfully saved then
flash error
redirect to new
stop processing"

While this won't prevent your item from being saved, it is causing the
controller to stop processing before the photo statements are called.

Try 'unless @item.save'

I'm also not sure that the photo uploading part of your photo model
will ever get called, since this form is in the /user application...
Uploads are something I struggled with myself, so I'm not going to say
much more about that.  In my application the form only handles
creating an upload, not an item _and_ and upload.  (There is a
seperate form for creating the item.)

Good luck!
64e445650d4b18f643e227fa64146483?d=identicon&s=25 Ali (Guest)
on 2007-03-16 00:35
(Received via mailing list)
It's working!!  Thank you so much!!  I love this forum - I'd be lost
without it!!
This topic is locked and can not be replied to.