Zilele trecute am dat de o situaţie în care am fost nevoit să folosesc un front controller.
Cam aşa am facut (multumiri autorului postului original):
# Să presupunem ca avem un controller numit Admin.
class AdminController < ApplicationController
def process(request, response, method = :perform_action, *arguments)
super(request, response, :index)
end
def index
@req_host = request.env["HTTP_HOST"]
@req_url = request.env["PATH_INFO"]
find_controller.constantize.new.process(request, response)
rescue NameError
# Actiunea default care va fi folosită în caz ca nu există controller-ul specificat
render :action => ‘index’
end def find_controller
controller = “”
action = “”
# URL-ul aşteptat va avea forma de mai jos (ex: /admin/mycontroller/myaction )
if @req_url =~ /^\/(\w*\_*\w*)\/(\w*\_*\w*)\/*(\w*\_*\w*)$/
controller = $2.to_s.downcase
action = $3.to_s.downcase
end
if action.empty? && !controller.empty?
action = ‘index’
end
params[:action] = action
case controller
when “admin_workshoptypes”
# Numele clasei controller-ului va fi returnată în caz că acesta a fost găsit
return “AdminWorkshoptypesController”
else
# Dacă niciun controller nu a fost găsit, numele unui controller inexistent va fi returnat
return “noController”
end
end
class AdminController < ApplicationController
def process(request, response, method = :perform_action, *arguments)
super(request, response, :index)
end
def index
@req_host = request.env["HTTP_HOST"]
@req_url = request.env["PATH_INFO"]
find_controller.constantize.new.process(request, response)
rescue NameError
# Actiunea default care va fi folosită în caz ca nu există controller-ul specificat
render :action => ‘index’
end def find_controller
controller = “”
action = “”
# URL-ul aşteptat va avea forma de mai jos (ex: /admin/mycontroller/myaction )
if @req_url =~ /^\/(\w*\_*\w*)\/(\w*\_*\w*)\/*(\w*\_*\w*)$/
controller = $2.to_s.downcase
action = $3.to_s.downcase
end
if action.empty? && !controller.empty?
action = ‘index’
end
params[:action] = action
case controller
when “admin_workshoptypes”
# Numele clasei controller-ului va fi returnată în caz că acesta a fost găsit
return “AdminWorkshoptypesController”
else
# Dacă niciun controller nu a fost găsit, numele unui controller inexistent va fi returnat
return “noController”
end
end
end
Dacă vom folosi: http://localhost:3000/admin/mycontroller/myaction,
se va trece prin controller-ul de mai sus, apoi o redirectare va fi făcută către controller-ul “mycontroller” şi către acţiunea “myaction” aferentă acestuia.
Spor la treaba.