dynamicが「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'
これをメソッド in と組み合わせ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"