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):
這顯然是通過加載路線造成的方式怎麼辦?
我能做些什麼,使工作(禁止類緩存並沒有解決它)
根據你發佈的內容,我不會說這很明顯,但有些代碼試圖修改一個導致該錯誤的凍結字符串。你確定它不是作爲渲染的一部分的控制器/模型動作/方法嗎?控制檯應該提供更明確的調試信息來追蹤罪魁禍首。 –
所以很明顯,代碼只是做得很好,但加載行 real_controller_actions = c_controller.constantize.action_methods 導致此問題。用靜態字符串做同樣的事情 –
我無法弄清楚在哪裏,但是在你使用的一個字符串中,你需要調用'.dup'方法來處理該字符串的解凍拷貝。這種偏離,只是基於你得到的錯誤信息。 – fmendez