Middleware a controller

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