如果動態意思是「認識我的行爲時,Rails的啓動和動態生成路線」:
這不是我會做,但它做什麼你希望它沒有任何做重定向也不method_missing的運行時開銷。
在config/routes.rb
controller_filenames = Dir.new("#{Rails.root}/app/controllers").entries
controller_filenames.each do |filename|
# you could restrict to only the pages_controller.rb on the next line,
# and in that case, you could simplify even more (see next example)...
if filename =~ /_controller\.rb$/
controller_name = filename.sub(/.rb$/, "")
controller_route_name = controller_name.sub(/_controller$/, "")
controller = controller_name.camelize.constantize.new
controller.action_methods.each do |action|
# if you don't want the controller name in your path match, just omit it...
match "#{controller_route_name}/#{action}" => "#{controller_route_name}##{action}", :as => "#{controller_route_name}_#{action}"
end
end
end
如果你只是想爲你的pages_controller.rb文件做到這一點,則:現在
controller_name = "pages_controller"
controller_route_name = "pages"
controller = controller_name.camelize.constantize.new
controller.action_methods.each do |action|
# I've removed the controller_route_name from the match here...
match "#{action}" => "#{controller_route_name}##{action}", :as => "#{controller_route_name}_#{action}"
end
,如果動態意味着「生成的路線,每當我動態生成新的動作」:
你可以重新盟友玩火。任何現有的操作都可以定義新的操作和路線。例如,我可以定義在config/routes.rb
路線(但是這可能是任何現有路線):
match '/dynamic_define' => 'application#dynamic_define'
夫婦,與在ApplicationController
的方法(同樣,這可能是任何現有的動作):
def dynamic_define
method_name = params[:mname]
self.class.send(:define_method, method_name) {
render :text => "output from #{method_name}"
}
Rails.application.routes.disable_clear_and_finalize = true
Rails.application.routes.draw do
match "/#{method_name}" => "application##{method_name}", :as => "application_#{method_name}"
end
render :text => "dynamic_define just created a new action named #{method_name}"
end
在瀏覽器中,您可以訪問:
/dynamic_define?mname=my_new_dynamic_action
# browser renders "dynamic_define just created a new action named my_new_dynamic_action"
然後訪問:
/my_new_dynamic_action
# browser renders "output from my_new_dynamic_action"
首先,謝謝你的回答。儘管如此,我正在尋找動態命名的路徑,所以我可以通過'foobar_path'來訪問它們,而不是明確指定操作。我知道我可以用個人路徑的':as'選項來做到這一點。任何方式來動態地做到這一點?謝謝! – 2012-05-06 02:40:45
爲什麼你想要動態加載路徑?你知道他們是基於你的路由器配置的助手嗎?我不認爲鐵路路由器是動態的... – thiagofm 2012-05-09 01:09:36