【问题标题】:How to organize models in Sinatra?如何在 Sinatra 中组织模型?
【发布时间】:2011-10-09 15:17:46
【问题描述】:

我在一个 Sinatra 项目中组织我的模型很烦人。

假设我有 2 个模型:PostComment,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

【问题讨论】:

标签: ruby-on-rails ruby sinatra models rack


【解决方案1】:

您应该将所有模型放在一个文件夹中,例如应用程序中的lib,然后您可以将其添加到您的 Sinatra 应用程序文件的顶部:

$: << File.dirname(__FILE__) + "/lib" # Assuming app.rb is at the same level as lib

require 'post'
require 'comment'

您应该组织您的代码,以便在加载所有模型声明之前不要调用其他模型。

【讨论】:

  • 如果我有一堆模型怎么办?我的应用程序的结构是 ["app.rb", "controllers/*", "models/*"] 并且所有这些都在 lib 文件夹中。我要求他们在config.ruDir["lib/**/*"].each { |f| require f if File.extname(f) =~ /\.rb/ }
  • 当然——这有点神奇。我更喜欢拥有我和其他人可以阅读和理解的代码。 “在哪里需要'发布'?搜索它......嗯......”
  • 好的。在您上面的代码中,如果我在Post 模型中调用Comment,它会引发错误吗?
  • 不,应该没问题,但您需要发布代码来验证。
  • 是的。这是这个要点!我的模型:gist.github.com/be46a7aa54d5b5454d1b 还有post.rb。如果comment.rbpost.rb 之前加载,这是一个问题!
【解决方案2】:

Rails 方式基于一个非常好的 Ruby 特性:const_missing。你可以编写你的 const_missing 方法或在网上寻找 const_missing 和 sinatra 的解决方案。

【讨论】:

    【解决方案3】:

    当我尝试这个时没有问题

    如果评论在 Post 方法中,则不应实际评估 一定是有什么情况触发了NameError

    不要在类声明的主体中调用 Post 根据第一位评论者的建议加载所有模型文件

    不应该有与 Java 本身相同的引用问题 在像 Ruby 这样的动态语言中

    【讨论】:

      猜你喜欢
      • 2014-06-14
      • 2020-05-19
      • 1970-01-01
      • 1970-01-01
      • 2016-09-20
      • 2020-11-14
      • 1970-01-01
      • 2023-03-07
      • 1970-01-01
      相关资源
      最近更新 更多