2013-04-13 56 views
0

我有一個Rails應用程序(Rails的3.2.9/Ruby 1.9.3),它由幾個小部分組成(一旦它是一個大的單一的應用程序,但我是有必要將其分解成組件)。Rails路由 - 動態從寶石 - 無法修改凍結字符串

現在我已經有幾個部分的應用程序,作爲寶石加載到主應用程序。

我想動態地加載路由到應用的部分,我也嘗試阻止URL黑客,這就是爲什麼我想動態創建所有可用的路由並將控制器#操作部分放入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

根據你發佈的內容,我不會說這很明顯,但有些代碼試圖修改一個導致該錯誤的凍結字符串。你確定它不是作爲渲染的一部分的控制器/模型動作/方法嗎?控制檯應該提供更明確的調試信息來追蹤罪魁禍首。 –

+0

所以很明顯,代碼只是做得很好,但加載行 real_controller_actions = c_controller.constantize.action_methods 導致此問題。用靜態字符串做同樣的事情 –

+0

我無法弄清楚在哪裏,但是在你使用的一個字符串中,你需要調用'.dup'方法來處理該字符串的解凍拷貝。這種偏離,只是基於你得到的錯誤信息。 – fmendez

回答

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