我有一个 Rails 应用程序(Rails 3.2.9/Ruby 1.9.3),它由几个小部分组成(曾经是一个大的单个应用程序,但我有必要将其拆分为组件)。
现在我已经有了应用程序的几个部分,作为宝石加载到主应用程序中。
我正在尝试动态地将路由加载到应用程序的各个部分,我也尝试防止 URL-Hacking,这就是为什么我想动态创建所有可用路由并将 controller#action 部分放入这样的 SHA1 字符串中:
get "/#{controller+action as SHA!}/:id", :controller => c_name, :action => ac
我的一个组件中的整个代码如下所示(在 routes.rb 中):
Rails.application.routes.draw do
BootLog.info "loading -> Smartconcepts#Concept routes"
SmartconceptsConcept::SmartconceptsConceptEngine::LOADED_CONTROLLERS.each do |c_name|
c_controller = c_name.camelize
c_name = c_name.gsub("_controller", "")
hex_name = Digest::SHA1.hexdigest(c_name)
real_controller_actions = c_controller.constantize.action_methods
BootLog.info " -- register: #{c_name} as: #{hex_name}"
BootLog.info " --- #{real_controller_actions.size} actions"
# Default
get "/#{hex_name}/:action(.:id)", :controller => c_name
post "/#{hex_name}/:action(.:id)", :controller => c_name
real_controller_actions.each do |ac|
a_hex_name = Digest::SHA1.hexdigest((ac+c_name))
BootLog.info " ---- #{c_name}##{ac} as: #{a_hex_name}"
get "/#{a_hex_name}/:id", :controller => c_name, :action => ac
post "/#{a_hex_name}/:id", :controller => c_name, :action => ac
end
end
end
所以...
SmartconceptsConcept::SmartconceptsConceptEngine::LOADED_CONTROLLERS
从我的引擎加载非常好,加载 action_methods 也可以正常工作。
rake routes
完全显示了我的期望,但是在浏览器中加载页面时,我得到了
RuntimeError (can't modify frozen String):
这显然是由我的方式加载路线引起的?
我该怎么做才能让它工作(禁用类缓存没有解决它)