Zmiana wywołanego kontrolera

Witam

Mam następujący problem i nie mogę sobie z nim poradzić. Sytuacja jest taka:

Gdy zostanie wywołany adres: www.adresstrony.pl/kontroler/akcja/parametry
wszystko dzieje się normalnie,
natomiast po wywołaniu
www.subdomena.adresstrony.pl/paramtetr/paramter/paramter/…
Aby został wywołany konkretny kontroler i wszystkie parametry zostały przekazane do jednej akcji.
Na serwerze korzystam z wildcards, i ApplicationControler sprawdzam czy występuje subdomena, jeśli tak to chciałbym, aby nie wykonał się kontroler z adresu, tylko już konkretnie wskazany przezemnie

Z góry dziękuje za odpowiedzi, które mnie naprowadzą na rozwiązanie

Hmm, w Rails 3 to jest łatwiejsze do zaimplementowania…

http://guides.rubyonrails.org/routing.html#route-requirements

popatrz co możesz zrobić z :conditions i :requirements, chyba w :conditions da się jakoś subdomenę sprecyzować.

Może mod_rewrite pomógłby?

Sevin: a używasz http://github.com/mbleigh/subdomain-fu ?

Z tego co wiem, to requirements są też w railsach 2.x, ale requirements są trochę ograniczone.

Z pozostałych możliwości:

  1. Możesz użyć mod_rewrite tak jak zaproponował hekto5
  2. Możesz użyć rack rewrite, pozwoli pewnie na wszystko to co mod_rewrite (a może nawet więcej), a reguły możesz trzymać w kodzie.
  3. Można też napisać własny rack middleware, który będzie w zależności od parametrów ustawiał odpowiedni controller/action, albo przepisywał wewnętrznie REQUEST_PATH

Ja bym spróbował na początku rack-rewrite. W metodzie rewrite możesz sprawdzić adres wyrażeniami regularnymi, a jak to nie wystarczy, to w rubim używając lambdy.

Dziękuje za odpowiedzi.

  1. A załóżmy, że spróbuje w najprostszy sposób dla mnie czyli mod_rewrite, umieszczam jakiegoś prostego htaccessa w folderze public aplikacji, oraz próbowałem w głównym folderze, ale railsy kompletnie tego nie widzą. Pracuje na localhoscie z InstantRails. Jakieś podpowiedzi?

  2. A drugie pytanie czy mógłbym zrobić np. coś takiego, aby stworzyć nową instancje jakiegoś kontrolera, wywołać jakąś jego akcje i przerwać działanie skryptu, aby nie doszło do wykonania akcji kontrolera z url’a ?

  3. Próbowałem coś zadziałać z rack-rewrite, zacząłem od zainstalowania go jako plugin, ale w folderze vendor/plugins stworzył się jedynie pusty folder o nazwie rack-rewrite, tak ma być, czy zrobiłem coś źle?

Wiem, że pewnie te pytania są dziwne/głupie/banalne, ale dopiero zaczynam z railsami i robię co mogę :wink:

  1. Musisz dopisać subdomene w /etc/hosts, przykładowo będziesz tam miał

127.0.0.1 owoce.sklepik.localhost
127.0.0.1 localhost

  1. Sam niedawno coś zacząłem grzebać z middleware i to mi pomogło sporo, http://amberbit.pl/blog-pl/2009/04/04/wprowadzenie-do-programowania-rack-middleware/ aha i oczywiście http://guides.rubyonrails.org/rails_on_rack.html

Railsy nie są odpowiedzialne za .htaccess. To jest plik apacha, więc bez apacha .htaccess nic nie zmieni w aplikacji.

Nie do końca rozumiem. Mógłbyś podać jakiś realny use case? Tzn. do czego coś takiego było by Ci potrzebne?

rack-rewrite nie jest pluginem railsowym tylko gemem. Zobacz w readme opis instalacji dla railsów: http://github.com/jtrupiano/rack-rewrite

Zakładając, że używasz railsów 2.x, wklej poniższy kod w environment.rb w bloku Rails::Initializer.run i powinno działać.

[quote]config.gem ‘rack-rewrite’, ‘~> 1.0.0’
require ‘rack/rewrite’
config.middleware.insert_before(Rack::Lock, Rack::Rewrite) do
rewrite ‘/wiki/John_Trupiano’, ‘/john’
r301 ‘/wiki/Yair_Flicker’, ‘/yair’
r302 ‘/wiki/Greg_Jastrab’, ‘/greg’
r301 %r{/wiki/(\w+)_\w+}, ‘/$1’
end[/quote]

No dobrze, udało się uruchomić rack-rewrite, i przykłady działają.
Jednak mam problem aby w momencie gdy występuje subdomena przekierować to na konkretny kontroler, a w innym przypadku żeby został standardowy routing. Próbowałem już na różne sposoby, ale mam odczucie, że działam na ślepo :wink:

Jakieś podpowiedzi jak to osiągnąć?

[quote=Sevin]No dobrze, udało się uruchomić rack-rewrite, i przykłady działają.
Jednak mam problem aby w momencie gdy występuje subdomena przekierować to na konkretny kontroler, a w innym przypadku żeby został standardowy routing. Próbowałem już na różne sposoby, ale mam odczucie, że działam na ślepo :wink:

Jakieś podpowiedzi jak to osiągnąć?[/quote]
Oczywiście musiałem nie doczytać, że w całym wątku chodzi o subdomeny :wink:

Rozwiązywałem ostatnio taki problem w aplikacji railsowej i napisałem prosty middleware. Wyekstraktowałem to przed chwilą do gema: http://github.com/drogus/rack-subdomain

Zainstaluj gema i wrzuć coś takiego do config/environment.rb:

config.middleware.use(Rack::Subdomain, "example.org", "/users/:subdomain")

W tej postaci path zostanie przepisany na /users/:subdomain/original/path, czyli na przykład dla requestu do: drogus.example.org/account wywolana zostanie ścieżka: example.org/users/drogus/account.

Hmm… Nie bardzo mi to pomogło.
Ale może po kolei.

  • Dodałem do pliku hosts, domenę sevin.enlynx wskazującą na localhost
  • Zainstalowałem powyższego gema
  • Dodałem poniższą linie do environment.rb:
config.middleware.use(Rack::Subdomain, "enlynx", "/users/:subdomain")

Jednak po wywołaniu adresu http://sevin.enlynx:3000/, i tak zostaje wywołany domyślny kontroler, a nie users.

Jak widać idę w zbyt duży projekt jak na początki w rails, ale myślę, że tak najszybciej się go nauczę.

Dziękuje za dotychczasową pomoc :slight_smile:

Mój błąd :wink:

Pisałem ten middleware dla railsów 3, nie sprawdzalem go z railsami 2.x. Wrzuciłem małą poprawkę, która ustawia request_uri, dzięki czemu railsy 2.x też wskazują na nowy adres.

Zrób gem update rack-subdomain i spróbuj jeszcze raz, teraz powinno zadziałać.

Dzięki wielkie, teraz działa jak należy :slight_smile: