【问题标题】:undefined method recreate_versions! for :string in carrierwave and rails 4.0.beta1未定义的方法 recreate_versions! for :string incarrierwave 和 rails 4.0.beta1
【发布时间】:2013-05-24 18:49:57
【问题描述】:

我得到一个:

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 

【问题讨论】:

  • 可能想更新到 Rails 4 RC1。
  • 我很快就会,但这会对这个特定问题产生影响吗?
  • 不,这不会影响您当前的问题。我会发布一个答案。

标签: ruby-on-rails imagemagick carrierwave


【解决方案1】:

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

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

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

【讨论】:

  • 感谢您的回复。这是删除该块后 rails 控制台的输出: 2.0.0p0 :006 > User.photo.class NoMethodError: undefined method `photo' for #<0x007ff3b12fb9d8>
  • &lt;&gt;
【解决方案2】:

在用户模型中写

mount_uploader :photo, PhotoUploader

【讨论】:

  • 感谢您的回复,但我的用户模型中已经有了。
【解决方案3】:

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

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

【讨论】:

  • 谢谢。你会推荐我在哪里调用 recreate_versions!尽管?不知道放在哪里...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-08-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-25
  • 1970-01-01
相关资源
最近更新 更多