Nie jestem zbyt obeznany w kwestiach middleware, chciałbym sie upewnic czy w dobrą stronę kombinuje. Do serwisu przekierowane są dodatkowe subdomeny czy domeny inne niż domyślna domena. Jeśli jest inna niż domyślna to chciałbym sprawdzić czy jestem w odpowiednim kontrolerze i jesli nie to gdziestam przekierowac, ale podejrzewam ze na poziomie middleware nie mam dostepu do kontrolera ? Czyli zostaje prawdopodobnie jakies sprawdzanie sciezki w urlu (dla tych zewnetrznych domen maja one ustalony format) bo do zmienych z requesta mam dostep w env ? wtedy mozna by uzyc tego http://hugofrappier.wordpress.com/2009/11/18/permanent-301-redirections-using-a-rack-middleware-in-rails/
Odpowiadając na Twoje pytanie: na poziomie middleware’a masz dostęp do czystego żądania http czyli m.in. do ścieżki, domeny, parametrów, rodzaju zapytania (get, post etc.), ciasteczek itd. Nie masz dostępu do kontrolera (bo skojarzenie i odpalenie odpowiedniego kontrolera na podstawie urla jeszcze nie nastąpiło), ale na upartego mógłbyś sprawdzić do jakiego trafi to żądanie (np. ActionController::Routing::Routes.recognize_path("/") => {:action=>“main”, :controller=>“home”}), chociaż nie masz pewności że faktycznie taka akcja zostanie odpalona (bo np filtr na to nie pozwala).
dzięki za odpowiedź, wykombinowałem sobie narazie coś takiego. chodzi ok
[code=ruby]class UserDomainMiddleware
def initialize(app)
@app = app
end
def call(env)
if !env['HTTP_HOST'].include? MY_HOST and (env['REQUEST_PATH'].blank? or !env['REQUEST_PATH'] =~ JAKIS_REGEXP)
[301, {"Location" => "http://#{HOST}"}, 'Redirecting you to the new location...']
else
@app.call(env)
end
end
end[/code]
Mam kilka pytań.
Jak najlepiej coś takiego podpiąć, czy config.middleware.use “UserDomainMiddleware” czy raczej config.middleware.insert_before Rack::Lock, “UserDomainMiddleware” ?
Domyślam się że takie middleware jest szybkie i nie ma co się przejmowąć tym że będzie to odpalane w sumie dla każdego requestu ?
Rozumiem że z poziomu middleware nie mam także dostępu do bazy i modeli ?
[quote=Artur79]Jak najlepiej coś takiego podpiąć, czy config.middleware.use “UserDomainMiddleware” czy raczej config.middleware.insert_before Rack::Lock, “UserDomainMiddleware” ?
Domyślam się że takie middleware jest szybkie i nie ma co się przejmowąć tym że będzie to odpalane w sumie dla każdego requestu ?
Rozumiem że z poziomu middleware nie mam także dostępu do bazy i modeli ?[/quote]
Rozważ podpięcie po ActionController::Failsafe, dzięki temu w przypadku jakiegoś wyjątku użytkownik dostanie odpowiedni komunikat od railsów. Umieszczanie przed lockiem nie jest zbyt bezpieczne (ten middleware dba o to by tylko jeden wątek obsługiwał żądanie).
Dostęp do modeli masz. Modele to zwykłe klasy, a klasy dostępne są globalnie, dlatego możesz je używać z powodzeniem w middlewarach.
Jeżeli chcesz mieć ładne API do ustawiania tego typu redirectów, to są już do tego gotowe aplikacje rack:
http://coderack.org/users/jtrupiano/middlewares/37-rackrewrite
http://coderack.org/users/cwninja/middlewares/106-rack-forcedomain
Być może załatwią część tego co potrzebujesz.
dzięki za odpowiedzi i linki, wypróbuje