【发布时间】:2018-07-10 08:40:58
【问题描述】:
我正在尝试进行一些元编程以根据现有类动态定义路由。
我的目标:根据定义的类动态创建合适的路由。
代码如下:
app/models/widget.rb
class Widget < ApplicationRecord
mattr_reader :available_types
class_variable_set(:@@available_types, {})
def self.type
available_types.key(name)
end
def self.register_type(key)
@@available_types[key] = self
end
end
app/models/widgets/a.rb
class Widget::a < Widget
register_type :a
end
config/environments/development.rb
...
config.eager_load = true
...
现在,当我打开控制台,输入:Widget.available_types 我立即可以看到:{ a: Widget::A }
所以现在我正在尝试创建路线:
config/routes.rb
namespace :widgets do
Widget.available_types.keys.each do |widget_type|
resources widget_type.to_s.pluralize
end
end
不幸的是,这不起作用。
此时routes.rb文件加载完毕,Widget.available_types为空。
将此更改添加到 routes.rb 使其正常工作,但这不是解决方案
config/routes.rb
Widget::A #manually call the class here. This makes code working but don't want that
namespace :widgets do
Widget.available_types.keys.each do |widget_type|
resources widget_type.to_s.pluralize
end
end
所以我的问题是:如何强制 rails 在加载 routes.rb 文件之前加载所有必要的类?
【问题讨论】:
-
你用的是哪个版本的rails?
-
我使用的是 rails 版本:5.0.2
标签: ruby-on-rails ruby metaprogramming