我在Sinatra项目中有一个可靠的组织模型。
假设我有2个模型:Post
和Comment
,nn Post
模型,我必须调用Comment
模型。现在我有<class:Post>': uninitialized constant Comment (NameError)
。
我知道在订购模型需求时存在问题,但如果我有很多模型呢?什么是Rails方式需要模型等?
更新
我在Sinatra / Rack / Grape应用程序中将此代码用于auto_load
我的模型。此代码应位于代码的顶部,即引导文件中。
models = File.join(File.dirname(__FILE__), 'app', 'models') # path to your models
$LOAD_PATH << File.expand_path(models)
# Constent Missing for requiring models files
def Object.const_missing(const)
require const.to_s.underscore
klass = const_get(const)
return klass if klass
end
答案 0 :(得分:4)
您应该将所有模型放在应用程序中的lib
文件夹中,然后将其添加到Sinatra应用程序文件的顶部:
$: << File.dirname(__FILE__) + "/lib" # Assuming app.rb is at the same level as lib
require 'post'
require 'comment'
您应该组织代码,以便在加载所有模型声明之前不要调用其他模型。
答案 1 :(得分:3)
Rails方式基于一个非常好的Ruby特性:const_missing。您可以编写const_missing方法或在Web上查找const_missing和sinatra的解决方案。
答案 2 :(得分:0)
我尝试这个时没有问题
评论是否在Post的方法中不应该实际评估 必须有一些情况触发NameError
不要在类声明的主体中调用Post 根据第一个评论者的建议加载所有模型文件
不应该像Java本身一样具有相同的参考麻烦 在像Ruby这样的动态语言中