undefined方法recreate_versions! for:在carrierwave和rails 4.0.beta1中的字符串

时间:2013-05-24 18:49:57

标签: ruby-on-rails imagemagick carrierwave

我得到了:

NoMethodError in UsersController#show
undefined method `recreate_versions!' for "img1.jpg":String

我打电话的时候:

User.all.each do |user|
  user.photo.recreate_versions!
end

在我的已安装的上传器中。我的表列名为photo,数据类型为String,在我的User模型中由attr_accessible调用。有任何想法如何解决这个问题?

这是我的完整代码:

class PhotoUploader < CarrierWave::Uploader::Base
  include CarrierWave::RMagick
  include Sprockets::Rails::Helper

  storage :file

  def store_dir
    "uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}"
  end

  def default_url

    "fallback/" + [version_name, "img1.jpg"].compact.join('_')
  end

  version :mini_thumb do 
    process :resize_to_limit => [50, 40]
  end

  version :thumb do
    process :resize_to_limit => [100, 100]
  end

  version :default do 
    process :resize_to_limit => [250, 250]
  end

  User.all.each do |user|
     user.photo.recreate_versions!
   end
end

也许我不应该从已安装的上传程序中调用recreate_versions?

编辑:

正在运行

User.first.photo.class

在控制台输出中:

  User Load (10.5ms)  SELECT "users".* FROM "users" ORDER BY "users"."id" ASC LIMIT 1
  User Load (10.5ms)  SELECT "users".* FROM "users" ORDER BY "users"."id" ASC LIMIT 1
 => PhotoUploader 

然后遍历每个用户并调用recreate_versions!:

2.0.0p0 :003 > User.all.each do |user|
2.0.0p0 :004 >       user.photo.recreate_versions!
2.0.0p0 :005?>   end
User Load (1.1ms)  SELECT "users".* FROM "users"
User Load (1.1ms)  SELECT "users".* FROM "users"
NoMethodError: undefined method `read' for nil:NilClass

在rails控制台中检查nil后,这有效(但仍然不确定放在哪里):

User.all.each do |user|
  user.photo.recreate_versions! if user.photo.present?
end 

3 个答案:

答案 0 :(得分:3)

我在代码中注意到的一件事是

的位置
User.all.each do |user|
  user.photo.recreate_versions!
end

你真的在PhotoUploader课程中加入了这个吗?如果是这样,那可能是你的问题。尝试从上传器中删除该代码。现在,打开rails控制台(在app文件夹中从命令行运行命令rails console)。输入User.first.photo.class。返回值应为PhotoUploader。如果是,那么上述也应该有效。将其复制并粘贴到控制台中,让我们知道它是如何进行的。

答案 1 :(得分:0)

在用户模型中写

mount_uploader :photo, PhotoUploader

答案 2 :(得分:0)

您当前的问题是,您希望照片在上传之前成为上传者。你不能调用recreate_versions!在它的类定义期间,它将用作user.photo的代理。

在设置过程中定义了上传器类后,您可以调用user.photo.recreate_versions!假设您安装了上传器。