views:

73

answers:

1

During some recent refactoring we changed how our user avatars are stored not realizing that once deployed it would affect all the existing users. So now I'm trying to write a rake task to fix this by doing something like this.

namespace :fix do

  desc "Create associated ImageAttachment using data in the Users photo fields"
  task :user_avatars => :environment do
    class User      
      # Paperclip
      has_attached_file :photo ... <paperclip stuff, styles etc>
    end

    User.all.each do |user|
      i = ImageAttachment.new
      i.photo_url = user.photo.url
      user.image_attachments << i
    end    
  end

end

When I try running that though I'm getting undefined method `has_attached_file' for User:Class

I'm able to do this in script/console but it seems like it can't find the paperclip plugin's methods from a rake task.

+1  A: 

the rake task is probably not be loading the full Rails environment. You can force it to do so by doing something like this:

require File.expand_path(File.dirname(__FILE__) + "/../config/environment")

where the path leads to your environment.rb file. If this were to fix the issue, you should include it inside this task specifically, because you probably do not want all your rake tasks to include the environment by default. In fact, a rake task may not even be the best place to do what you're trying to do. You could try creating a script in the script directory as well.

Pete
Thanks for the help. That worked. I needed to be able to specify RAILS_ENV while testing this. I'm not sure how to do that with a script. What would be the advantage of a script here?
gduq