0

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

这显然是由我的方式加载路线引起的?

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

4

1 回答 1

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
于 2013-04-15T17:42:25.357 回答