Forum: Ruby on Rails RE: Problem using rmagick in model class

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.
F01c3ff32fee35d911e81c172a005012?d=identicon&s=25 Tom Fakes (Guest)
on 2005-12-13 06:15
(Received via mailing list)
I think that in the code that didn't work, you were, in effect, creating
a class called Registrant::Magick::ImageList, because the *require* was
inside the class definition (this is how mixins do their magic).
However, it seems that doesn't apply if you use *require* inside a
method inside a class - your controller code that works.



Either put the *require* outside the class or module, or inside a method
to get the behavior you want.



________________________________

From: David Rose [mailto:doppler@gmail.com]
Sent: Monday, December 12, 2005 9:00 PM
To: rails@lists.rubyonrails.org
Subject: Re: [Rails] Problem using rmagick in model class



Doh.

So, it might be helpful if I understood why my previous code, where all
of this was in the controller, worked fine, even when the require_gem
statement was called within a class method. The controller method looked
like this:

def upload_image(*some_args)
  require_gem 'rmagick'
  #do stuff with Magick::ImageList
end



On 12/12/05, Tom Fakes < Tom@tomandlisa.us <mailto:Tom@tomandlisa.us> >
wrote:

Move the 'require_gem "rmagick"' line outside the class definition for
Registrant



  require_gem 'rmagick'
  class Registrant < ActiveRecord::Base
  ...





________________________________

From: David Rose [mailto:doppler@gmail.com]
Sent: Monday, December 12, 2005 10:04 AM
To: rails@lists.rubyonrails.org
Subject: [Rails] Problem using rmagick in model class



I'm refactoring some code in order to conform to "the right way" of
doing things. That is, I'm moving my image-saving code from my
controller to my model. What worked fine in the controller class is not
working in the model class.

Currently, my code looks somewhat like this:
##############
class RegistrantsController < ApplicationController
  def upload_image
    @registrant = Registrant.find(session[:registrant_id])
    if request.post?
      if(params[:crop_params])
        @registrant.save_image(params[:image_to_crop],
params[:crop_params])
        redirect_to :action => :index
      else
        @registrant.image = params[:registrant][:image]
        File.chmod(0644, @registrant.image)
      end
    end
  end
end

class Registrant < ActiveRecord::Base
  require_gem 'rmagick'

  def save_image(image_to_crop, crop_params)

    img_base = RAILS_ROOT + "/public/images/registrants/"
    img_file =  self.id.to_s + ".jpg"
    y, x, w, h = crop_params.split(',')

    img = Magick::ImageList.new(image_to_crop) # this is throwing
"uninitialized constant ImageList"

    img.crop!(x.to_i, y.to_i, w.to_i, h.to_i)
    img.resize!(120, 120)
    color_thumb = img.resize(32, 32)
    grey_img = img.quantize(256, Magick::GRAYColorspace)
    img.write(img_path + img_filename)
    grey_img.write(img_base + 'greyscale/' + img_filename)
    color_thumb.write(img_base + 'thumbnail/' + img_filename)
  end
end
##############

Note the comment in there (# this is throwing "uninitialized constant
ImageList")

Can anyone see what I've done wrong, or otherwise help out?

Thanks,
David Rose
Cb48ca5059faf7409a5ab3745a964696?d=identicon&s=25 unknown (Guest)
on 2005-12-13 08:06
(Received via mailing list)
On Mon, 12 Dec 2005, Tom Fakes wrote:

> I think that in the code that didn't work, you were, in effect, creating a
> class called Registrant::Magick::ImageList, because the *require* was inside
> the class definition (this is how mixins do their magic).  However, it seems
> that doesn't apply if you use *require* inside a method inside a class -
> your controller code that works.
>
> Either put the *require* outside the class or module, or inside a method
> to get the behavior you want.

'require' cares not where it's called from.  try prefacing the 'Magick'
constant with '::' to make sure you are refering to the top-level Magick
module.  in general you should always do this since:

   harp:~ > cat a.rb
   class Foo; end

   class Bar
     p Foo # gets top level foo
   end

   class FooBar
     Foo = 42
     p Foo
     p ::Foo # gets top level foo
   end


   harp:~ > ruby a.rb
   Foo
   42
   Foo

rails does some voodoo with const_missing that may have caused your
referencing
it to define one in your model - or perhaps you have another Magick
const
defined somewhere else in your code, since the code is your model now
this
should be quite easy to test.

regards.

-a
727d5785259d057745de13a9f3a713f4?d=identicon&s=25 David Rose (Guest)
on 2005-12-13 22:34
(Received via mailing list)
Ara, your suggestion to preface the call with :: worked perfectly.

I'm gonna stab in the dark and assume my use of file_column elsewhere in
the
model may be to blame.

Thanks
David Rose

On 12/13/05, ara.t.howard@noaa.gov <ara.t.howard@noaa.gov> wrote:
> > your controller code that works.
>
>
>
>
> Rails mailing list
> Rails@lists.rubyonrails.org
> http://lists.rubyonrails.org/mailman/listinfo/rails
>
>
>


--
David Rose
Webmaster, SXSW Conferences and Festivals
SXSW 2005 - March 11-20, 2005 - Austin, Texas
http://sxsw.com/
This topic is locked and can not be replied to.