Ruby on rails 轨道路线-Gems动态-can';不要修改冻结字符串
我有一个Rails应用程序(Rails 3.2.9/Ruby 1.9.3),它由几个小部分组成(曾经它是一个大的单一应用程序,但我必须将其拆分为多个组件) 现在我有了应用程序的几个部分,作为gems加载到主应用程序中 我试图动态地将路由加载到应用程序的各个部分,同时我也试图防止URL黑客攻击,这就是为什么我想动态地创建所有可用路由,并将控制器#操作部分放入SHA1字符串中,如下所示:Ruby on rails 轨道路线-Gems动态-can';不要修改冻结字符串,ruby-on-rails,ruby,load,routes,gem,Ruby On Rails,Ruby,Load,Routes,Gem,我有一个Rails应用程序(Rails 3.2.9/Ruby 1.9.3),它由几个小部分组成(曾经它是一个大的单一应用程序,但我必须将其拆分为多个组件) 现在我有了应用程序的几个部分,作为gems加载到主应用程序中 我试图动态地将路由加载到应用程序的各个部分,同时我也试图防止URL黑客攻击,这就是为什么我想动态地创建所有可用路由,并将控制器#操作部分放入SHA1字符串中,如下所示: get "/#{controller+action as SHA!}/:id", :controller =
get "/#{controller+action as SHA!}/:id", :controller => c_name, :action => ac
我的一个组件中的整个代码如下所示(在routes.rb中):
所以
从我的引擎加载很好,加载action_方法也很好
rake routes
完全显示了我的期望,但在浏览器中加载页面时
RuntimeError (can't modify frozen String):
这显然是由我这样的装货路线造成的
我该怎么做才能使它工作(禁用类缓存并不能解决它)加载的控制器操作名称所在的问题 使用.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
根据您发布的内容,我不会说这是显而易见的,但是一些代码试图修改冻结的字符串,这正是导致该错误的原因。您确定它不是作为渲染一部分的控制器/模型操作/方法吗?控制台应该提供更明确的调试信息来追踪罪魁祸首。因此,显然代码做得很好,但是加载行real\u controller\u actions=c\u controller.constantize.action\u方法会导致问题。使用静态字符串执行相同的操作我无法确定在何处,但在您使用的其中一个字符串中,您需要调用
.dup
方法来处理该字符串的未冻结副本。当然,这只是基于您收到的错误消息。实际上,我认为可能是这一行:c\u controller=c\u name.camelize
将其更改为:c\u controller=c\u name.dup.camelize
RuntimeError (can't modify frozen String):
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