Rails路由 - 来自Gems的动态 - 无法修改冻结的String

时间:2013-04-13 02:17:26

标签: ruby-on-rails ruby load routes gem

我有一个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):

这显然是由我加载路线造成的?

我该怎么做才能使它工作(禁用类缓存没有解决它)

1 个答案:

答案 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