Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 轨道路线-Gems动态-can';不要修改冻结字符串_Ruby On Rails_Ruby_Load_Routes_Gem - Fatal编程技术网

Ruby on rails 轨道路线-Gems动态-can';不要修改冻结字符串

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 =

我有一个Rails应用程序(Rails 3.2.9/Ruby 1.9.3),它由几个小部分组成(曾经它是一个大的单一应用程序,但我必须将其拆分为多个组件)

现在我有了应用程序的几个部分,作为gems加载到主应用程序中

我试图动态地将路由加载到应用程序的各个部分,同时我也试图防止URL黑客攻击,这就是为什么我想动态地创建所有可用路由,并将控制器#操作部分放入SHA1字符串中,如下所示:

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