我应该在哪里放置非模型的简单类(它们不代表任何数据)并仅提供某些功能?
例如:
class FileUploader
def save_uploaded_file(filename, tempfile)
path = Rails.root.join('public', 'uploads', filename)
File.open(path, 'wb+') do |file|
file.write(tempfile.read)
end
end
end
这样做只是将文件复制到预定义的位置。
我必须将其放在models
下吗?或者Rails是否有其他位置更适合这类课程?我之前试过放入lib
,但是由于Rails缓存了lib
目录中的文件(编辑后的配置不缓存文件,但它仍然缓存在{{1}内部),这太痛苦了。 })。
所以,我将这些文件放在lib
中,但测试变得非常痛苦(我刚刚开始使用Rails,也许我在测试中做错了)因为rake吐出了没有设置的错误测试数据库(我想测试任何形式或形状与数据库无关的类 - 为什么我需要设置数据库?)。
答案 0 :(得分:4)
我已经将app/lib
添加到我的某些项目中以适应这种情况,但还有新的Rails 4 concerns
位置,例如app/models/concerns
或app/controllers/concerns
,具体取决于在哪里使用这种东西。
你是对的,最好避免在app/models
中放入非模型类。
答案 1 :(得分:2)
对于服务类型对象,我将它们放在app / services中。
对于模型类型的对象,我将它们放在app / models中。我不认为有必要继承ActiveRecord作为模型。
我认为你的对象被归类为“服务对象”,因为它被设计为包装上传文件的服务,它实际上不是像模型那样的域对象。