小编use*_*335的帖子

ruby:如何正确要求(避免循环依赖)

今天我遇到了一个奇怪的问题:模块上出现"遗漏方法"错误,但方法就在那里,并且需要定义模块的文件.经过一番搜索,我找到了一个循环依赖,其中2个文件需要彼此,现在我认为ruby默默地中止循环要求.


编辑开始:示例

文件'a.rb':

require './b.rb'

module A
    def self.do_something
        puts 'doing..'
    end
end
Run Code Online (Sandbox Code Playgroud)

文件'b.rb':

require './a.rb'

module B
    def self.calling
        ::A.do_something
    end
end

B.calling
Run Code Online (Sandbox Code Playgroud)

执行b.rb给出b.rb:5:in 'calling': uninitialized constant A (NameError).对于两个文件都必须存在这些要求,因为它们要从命令行自行运行(我省略了该代码以保持简短).所以B.calling必须在那里.一种可能的解决方案是将需求包装起来if __FILE__ == $0,但这似乎不是正确的方法.

编辑结束


避免这些难以发现的错误(顺便说一下,如果要求抛出异常会不会更好?),是否有一些关于如何构建项目的指导方针/规则以及在哪里需要什么?例如,如果我有

module MainModule
  module SubModule
    module SubSubModule
    end
  end
end
Run Code Online (Sandbox Code Playgroud)

我应该在哪里需要子模块?所有在主要的,或只有主要的sub和sububub中的sub?

任何帮助都会很好.

摘要

在forforfs的回答和评论中讨论了为什么会发生这种情况的原因.

到目前为止,最佳实践(如lain指出或暗示)似乎如下(如果我错了,请纠正我):

  1. 将顶级命名空间中的每个模块或类放在以模块/类命名的文件中.在我的例子中,这将是一个名为'main_module.rb'的文件.如果有子模块或子类,则创建一个以模块/类命名的目录(在我的示例中为目录'main_module',并将子类/子模块的文件放在那里(在示例1中名为'sub_module.rb'的文件中)对命名空间的每个级别重复此操作.
  2. 需要一步一步(在示例中,MainModule将需要SubModule,Submodule并将需要SubSubModule)
  3. 将"运行"代码与"定义"代码分开.在运行代码中需要一次您的顶级模块/类,因此2.由于您的所有库功能现在都应该可用,并且您可以运行任何已定义的方法.

感谢所有回答/评论的人,这对我帮助很大!

ruby dependencies circular-dependency dependency-management

14
推荐指数
2
解决办法
1万
查看次数

rails 3 - 多个控制器之间共享的代码 - 放在哪里?

我有2个控制器需要一段代码,但不是全部.这种方法属于哪里?我已经阅读过有关帮助程序的内容,但这些内容似乎与视图相关的代码有关.有人提出了lib文件夹,但这似乎与控制器逻辑"相距太远",我在视图或模型中不需要它.有人遇到过那种问题吗?

model-view-controller ruby-on-rails-3

9
推荐指数
1
解决办法
3068
查看次数

Ruby/Rails同步作业管理器

嗨,
我要设置一个rails-website,在一些初始用户输入之后,进行了一些繁重的计算(通过c-extension到ruby,将使用多线程).因为这些计算几乎消耗所有cpu-time(内存也是如此),所以一次运行的计算决不应该多于一个.我也不能使用(异步)后台作业(比如延迟作业),因为rails必须显示该计算的结果,并且该站点应该在没有javascript的情况下工作.
所以我想我需要一个单独的进程,其中所有rails实例必须排队他们的计算请求并等待答案(如果队列已满,可能是错误消息),一种同步作业管理器.

有没有人知道是否有这样的功能的宝石/插件?(nanite对我来说似乎很酷,但似乎只是异步,因此rails实例不知道计算何时完成.这是正确的吗?)
另一个想法是使用分布式ruby(drb)编写我自己的,但为什么发明如果车轮已经存在,那又一次转动?

任何帮助,将不胜感激!

编辑:由于zaius的提示,我想我将能够异步执行此操作,所以我将尝试resque.

ruby jobs ruby-on-rails synchronous task-queue

5
推荐指数
1
解决办法
1529
查看次数

活动记录3使用嵌套表进行选择

我有这些课程:

class Game < ActiveRecord::Base
    has_many :offers
    #table has an integer-column 'season'
end

class Broker < ActiveRecord::Base
    has_many :offers
end

class Offer < ActiveRecord::Base
    belongs_to :game
    belongs_to :broker
end
Run Code Online (Sandbox Code Playgroud)

例如,我想从一个经纪人选择2009年游戏季节的所有优惠.我试过了

Broker.first.offers.joins(:game).where(:game => {:season => 2009}).each do |o|
    puts o.inspect
end
Run Code Online (Sandbox Code Playgroud)

但这给了我

`救援日志":PGError:错误:缺少FROM子句为表 "游戏" 项(ActiveRecord的:: StatementInvalid)线路1:......游戏" ON "游戏ID "= "报价game_id "".""." WHERE "游戏". "SE ...:选择 "提供大量的 "INNER JOIN "游戏" ON "游戏ID" = "报价game_id "WHERE "游戏的季节 ""*FROM.""."".""." = 2009 AND("offer".broker_id = 1)

我该怎么做这样的选择,或者我在哪里可以找到更多相关信息?

ruby activerecord nested ruby-on-rails-3

1
推荐指数
1
解决办法
1762
查看次数