这很奇怪,但是:
上传器类(应用程序/上传器):
class ImageUploader < CarrierWave::Uploader::Base
include CarrierWave::RMagick
# ....
version :thumb, from_version: :preview do
process resize_to_limit: [Image::THUMB_WIDTH]
end
图片类(应用/模型):
class Image < ActiveRecord::Base
include Rails.application.routes.url_helpers
mount_uploader :image, ImageUploader
THUMB_WIDTH = 220
PREVIEW_WIDTH = 460
MAX_WIDTH = 960
该应用程序说:
uninitialized constant Image::THUMB_WIDTH
version :thumb, from_version: :preview do
process resize_to_limit: [Image::THUMB_WIDTH] #<<<----
end
version :preview, from_version: :fullsize do
怎么了?
更新:
阿吉斯指出了原因。
悬赏金将在2天之内得到最佳解决方案。我不喜欢代码分离,例如在初始化器中创建一个新类,以容纳Image类的所有常量。这种解决方案很糟糕,因为它带来了不一致性和代码碎片。
就rails autoloader而言,您有一个鸡或鸡蛋的盒子,从一般意义上来说,解决此问题的“ rails方法”将是重构元代码,以便将类名作为字符串值而不是类传递,例如:
belongs_to :manager, class_name: "Employee"
belongs_to
希望在所有课程都加载完毕后召集人员constantize
,class_name
以便避免“鸡蛋和鸡蛋”的“铁轨方式”。
什么@Stoic建议实质上是回避的评价这一主题的变化image.rb
,在image_uploader.rb
加载时间:
model.class.const_get("THUMB_WIDTH")
也可能被表述为:
'Image'.constantize.const_get("THUMB_WIDTH")
结果是相同的,并且从中得出的一般教训是:避免在类加载时代码中使用另一个类名文字,或者换句话说,这belongs_to :manager, class_name: "Employee"
是好事,belongs_to :manager, class_name: Employee
也可能是坏事。
它不是很漂亮,但是它可能是避免这些头痛的最优雅的通用方式
解决问题的另一种方法是,缩略图图标的宽度实际上是上传者关心的问题,而不是模型的问题,实际上,您看到的是不适当的亲密代码气味的边缘情况(http://www.codinghorror。 com / blog / 2006/05 / code-smells.html)。
当心那些花太多时间在一起的课程,或者以不适当的方式进行接口的课程。班级之间应尽可能少地了解彼此。
因此,如果您具有这种思想流派(我正朝着这个方向发展),解决方案将是使班级THUMB_WIDTH
保持不变,ImageUploader
然后问题就会消失。
无论如何,将不同的领域关注点从模型中分离出来通常是一个好主意,因为这些模型喜欢变得肿且难以管理-您可以将上载器类视为模型的服务类,旨在以相同的方式提取特定的领域问题值对象,表单对象等在http://blog.codeclimate.com/blog/2012/10/17/7-ways-to-decompose-fat-activerecord-models/中进行处理
计划C将config.autoload_paths
在您application.rb
和食指之间切换位置:)
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句