我有一个Rails应用程序(Rails 3.2.9 / Ruby 1.9.3),它由几个小部分组成(一旦它是一个大的单个应用程序,但我有必要将其拆分为组件)。
现在我已经有了应用程序的几个部分,作为宝石加载到主应用程序中。
我正在尝试动态地将路径加载到应用程序的各个部分,我也尝试阻止URL-Hacking,这就是为什么我想动态创建所有可用路由并将控制器#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):
这显然是由我加载路线造成的?
我该怎么做才能使它工作(禁用类缓存没有解决它)
答案 0 :(得分:1)
加载的控制器操作名称的问题。
使用.dup终于做到了。
real_controller_actions = c_controller.constantize.action_methods
#...
real_controller_actions.each do |ac|
a_hex_name = Digest::SHA1.hexdigest((ac.dup+c_name))
end