我想完成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读取这个配置文件并运行类/模块中定义的方法?
由于
答案 0 :(得分:3)
没有办法有效地做到这一点。 require
需要内容文件,句点。它不提供任何其他行为。 eval
解决方案不如实际正确编写Ruby文件,因此它们包含适当的命名空间信息。如果要在多个类中包含行为,请使用模块。
答案 1 :(得分:2)
不是我认为的良性代码,但你可以这样做:
class A
eval(File.read('yourfile.rb'))
end
答案 2 :(得分:1)
您的修改的答案是,rails在yield
方法中未使用Proc#call
或draw
。它可能使用instance_eval或class_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