我得到了:
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
答案 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!假设您安装了上传器。