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 %>