Friday, September 20, 2013

[Rails] Re: Accessing model attributes in ActiveSupport::Concern module

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|

On Wednesday, September 18, 2013 9:11:59 AM UTC-4, Felix Gläske wrote:
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

--
You received this message because you are subscribed to the Google Groups "Ruby on Rails: Talk" group.
To unsubscribe from this group and stop receiving emails from it, send an email to rubyonrails-talk+unsubscribe@googlegroups.com.
To post to this group, send email to rubyonrails-talk@googlegroups.com.
To view this discussion on the web visit https://groups.google.com/d/msgid/rubyonrails-talk/0146f7a3-94ac-44e9-b77d-7d7945d7ae27%40googlegroups.com.
For more options, visit https://groups.google.com/groups/opt_out.

0 Comments:

Post a Comment

Subscribe to Post Comments [Atom]

<< Home


Real Estate