Accessing model attributes in ActiveSupport::Concern module

I have some models which share the same functionality just on other paths. So I decided to put these methods in a module and set the path in the model. My problem is that I’m not able to access the attribute in my module.

my model:

class Job < ActiveRecord::Base
  include ImageModel

  image_dir = "jobs"
end
my module:

module ImageModel extend ActiveSupport::Concern

def delete_image unless pic_link == “” || pic_link == nil begin if File.delete(Rails.root.join(“public”, “images”, image_dir, pic_link)) return true else return false end rescue return true #an error occured but when the image does not exist we still return true end end

  return true
end

def replace_image(new_image)
  File.open(Rails.root.join("public", "images", image_dir, new_image.original_filename), "wb") do |f|
    if f.write new_image.          read

delete_image pic_link = new_image. original_filename return true #everything went fine else return false #return false if new image could not be written end end end end

The error I get:

undefined local variable or method `image_dir' for #<Job:0x007f8a93b9e8d8>
on this line:

File.open(Rails.root.join(“public”, “images”, image_dir, new_image.original_filename), “wb”) do |f|

Did I miss something or did I oversee something important?

Felix

Felix,

You defined image_dir as a local variable in the scope of the Job class. It goes out of scope (and, since nothing else references it, gets cleaned up) after the class definition of Job is evaluated. Instead, define image_dir on instances of Job:

class Job < ActiveRecord::Base

include ImageModel

def image_dir

@image_dir ||= ‘jobs’

end

end

Better yet, since image_dir is the same for every instance of Job, make it a class method:

class Job < ActiveRecord::Base

include ImageModel

def self.image_dir

@image_dir ||= ‘jobs’

end

end

and access it through the model’s class:

File.open(Rails.root.join(‘public’, ‘images’, self.class.image_dir, new_image.original_filename), ‘wb’) do |f|

To add a note, if image_dir is persistently stored in the db you can use the default opt in your Migration.