Forum: Ruby on Rails undefined method `content_type' when editing already-uploaded items (attachment_fu)

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.
716d914c90cf94c2663a914cd67653e8?d=identicon&s=25 Adam Morris (lostsync)
on 2009-02-19 08:44
(Received via mailing list)
My project is for a photographer's portfolio.  He's allowed to upload
photographs, which are then displayed on the site.  I'm using
attachment_fu.  All of this works fine.

Where I'm running into problems is in allowing him to edit the
photographs' attributes later.

Example:
I've uploaded a picture of a spider.  During the upload I enter the
title as "spider 1".  Great, the photo uploads, and if I go to to
admin/index, there it is.  Glorious.  But oops!  I forgot to
capitalize my title!  So I head to admin/edit/:photo_id, a form
displays, and I correct my mistake.  Then I click Update.  And oh
no.  :(

NoMethodError in AdminController#update

undefined method `content_type' for #<Photo:0xb67ffbf0>

I've been working on this problem for a while now.  Commenting out
everything attachment_fu related in my Photos model is the only way I
can make the edit form work (which of course breaks uploading).

Here is all relevant code:

models/photo.rb:

    class Photo < ActiveRecord::Base


attr_accessible :title, :description, :camera, :time, :date, :iso,
:lens,
                      :focal_length, :exposure, :aperture

      has_attachment :content_type => :image,
                     :storage => :file_system,
                     :path_prefix => 'public/photos',
                     :thumbnails => { :thumb => '320x200>' }
      validates_as_attachment
      validates_uniqueness_of :filename

      def full_filename(thumbnail = nil)
        file_system_path = (thumbnail ? thumbnail_class :
self).attachment_options[:path_prefix].to_s
        File.join(RAILS_ROOT, file_system_path, thumbnail_name_for
(thumbnail))
      end

      def exifize(photo)
        require 'mini_exiftool'
        @photo = photo
        @exif = MiniExiftool.new "public/photos/#{ @photo.filename }"
        @photo.camera = @exif.model
        @photo.time = @exif.datetimeoriginal.strftime('%I:%M %p')
        @photo.date = @exif.datetimeoriginal.strftime('%B %d, %Y')
        @photo.iso = @exif.iso
        @photo.lens = @exif.lens
        @photo.focal_length = @exif.focal_length
        @photo.aperture = @exif.aperture
        @photo.save
      end
    end

controllers/admin_controller.rb:

    def new
      @photo = Photo.new(params[:photo])
    end

    def create
      @photo = Photo.new(params[:photo])
      @photo.exifize(:photo)
      @photo.save
      if @photo.save
        flash[:notice] = 'Yay!'
        redirect_to :controller => 'admin', :action => :index
      else
        flash[:error] = 'boo...'
        redirect_to :controller => 'admin', :action => :error
      end
    end

views/admin/edit.html.erb:

    <% form_for :photo, :url => { :controller => 'admin',
                                  :action => 'update',
                                  :id => @photo } do |f| %>

      <p>
        <%= f.label :title %><br />
        <%= f.text_field :title %>
      </p>
      <p>
        <%= f.label :description %><br />
        <%= f.text_area :description %>
      </p>
      <p>
        <%= f.label :camera %><br />
        <%= f.text_field :camera %>
      </p>

      ...etc...

      <p>
        <%= f.submit "Update" %>
      </p>
    <% end %>

I'm lost.  Please help.
716d914c90cf94c2663a914cd67653e8?d=identicon&s=25 Adam Morris (lostsync)
on 2009-02-19 19:10
(Received via mailing list)
Reading documentation thoroughly is always good.  A member of
#rubyonrails on freenode helped me out.  Since uploading worked fine,
I didn't think to check my model.  I had neglected to add the
content_type column.  Oops.
This topic is locked and can not be replied to.