将配置存储在像Rails这样的文件中

时间:2010-07-30 00:17:24

标签: ruby-on-rails ruby

我想完成Rails所做的同样的事情,将配置存储在应用程序读取的rb文件中:

# routes.rb
MyApp::Application.routes.draw do |map|
  root :to => 'firstpage#index'
  resources :posts

在rails中,方法“root”和“resources”未在对象“main”范围中定义。

这意味着这些方法在模块或类中定义。但他们是如何需要routes.rb文件并从类/模块中使用这些方法的。

因为如果我使用“require”,那么这些方法将在“main”范围内执行,无论我在哪里运行“require”。

那么你怎么能让Rails读取这个配置文件并运行类/模块中定义的方法?

由于

3 个答案:

答案 0 :(得分:3)

没有办法有效地做到这一点。 require需要内容文件,句点。它不提供任何其他行为。 eval解决方案不如实际正确编写Ruby文件,因此它们包含适当的命名空间信息。如果要在多个类中包含行为,请使用模块。

答案 1 :(得分:2)

不是我认为的良性代码,但你可以这样做:

class A
  eval(File.read('yourfile.rb'))
end

答案 2 :(得分:1)

您的修改的答案是,rails在yield方法中未使用Proc#calldraw。它可能使用instance_evalclass_eval

(编辑)例如,以下是可能定义draw方法的方法:

def draw(&blk)
  class << context = Object.new
    def root(p1, p2)
      # ...
    end
    def resources(p1, p2)
      # ...
    end
  end
  context.instance_eval(&blk)
end

然后,您可以像这样使用它:

draw do
  root 2, 3
  resources 4, 5
end