Jak to rozumieć?

Witam

Ucze się Railsów, wczesniej pisałem trochę w Pythonie.
Znalazłem w artykule z LinuxMagazine o Railsach taką informację, że
“Javowy Struts przechowuje akcje (tym samym pośrednio zwracane wartości) w pliku XML;
w Rails taką rolę spełnia mechanizm odbić”.

W jaki sposób rozumieć te odbicia? Jeśli chodzi o akcje, to jak
rozumiem może to być np. przesłanie przez użytkownika danych
w formularzu. W struts jest ActionMapping który pozwala odwzorować
akcję na konkretny widok. W czym więc różni się rozwiązanie Railsowe? Wiem
że nie ma tam xmlów, ale w jaki właśnie sposób jest to “odwzorowanie” i
obsługa akcji realizowane? Na czym polegają wspomniane odbicia?

Dzięki za wskazówki i pozdrawiam

Pewnie mowa o Views, ktore sa szablonami RHTML (pliki tekstowe ze wstawkami Ruby’ego)
Nie ma oddzielnego systemu szablonow (sa nieoficjalne) i nie jest moim zdaniem potrzebny.
Standardowo jest tak, ze akcja list_something szuka w odpowiednim miejscu pliku list_something.rhtml (co oczywiscie mozna zmieniac).

“odbicie” to niezbyt szczesliwe IMHO tlumaczenie pojecia reflection. W skrocie jest to mechanizm introspekcji, pozwalajacy obiektom na badanie wlasciwosci innych obiektow (czy ma metode, pole itd). W Ruby’m jest szczegolnie dobrze rozwiniety (taka jest obiegowa opinia), ale w wystepuje tez w innych jezykach, takze w Javie.

Istnieje polskie okreslenie odzwierciedlenia (Thinking in Java). Nowoczesne javowe frameworki korzystaja z tego b. czesto obok runtime code generation i annotations.

Faktycznie bardzo dziwnie to napisane. Zaryzykowalbym nawet stwierdzenie, ze kompletna bzdura albo wyrwane z kontekstu.

Strutsa juz prawie nie pamietam (kazdy go zreszta juz powinien zapomniec dla wlasnego dobra :slight_smile: ), ale

Kazdy request zwiazany jest z jakas akcja. W Rails jest to metoda kontrolera a w przypadku Strutsa jest to oddzielna klasa, kt. dziedziczy z org.apache.struts.action.Action i przeciaza (ugh :frowning: wole nadpisuje) metode execute(),
execute() przetwarza request i zwraca obiekt ActionForward, kt. zazwyczaj jest JSP (rails: rhtml template) ale tez moze przekierowywac do innej akcji (rails: redirect_to).

A teraz sie cofniemy. Url w rails wyglada przykladowo http://localhost/recipe/create (czyli kontrolerem jest RecipeController i posiada met. create(), oczywiscie urlami sterujemy za pomoca routes.rb). Rails zidentyfikuje klase kontrolera (przy pomocy regul w routes.rb i konwencji nazewniczych), stworzy jego instancje i korzystajac z odzwierciedlen sprawdzi czy jest dana metoda (akcja) i ewentualnie ja wywola. W uproszczeniu:

class MessageController
  def show(msg)
    puts msg
  end
end

# to wlasnie reflection - jedna linijka kodu w porownaniu z java!
eval("MessageController").new.send(:show, ["Ruby on Rails"])

W Strutsie XML a dokladniej wiaza url z odpowiednia subklasa Action. (hmm… zdaje sie, ze w Strutsie jest tylko jeden kontroler - ActionServlet?). Przykladowo:

<action-mappings>
  <action path="/createRecipe" 
          type="org.tralala.controllers.CreateRecipeAction"
          name="createRecipe"
          scope="request">
    <forward name="success" path="/showRecipe"/>      
  </action>
  <action path="/showRecipe" itd... 

Czy gdzies po drodze Struts tez korzysta z reflection to nie wiem. W zrodla nie patrzylem, ale wydaje mi sie, ze tak. Chodzi raczej nie tyle o reflection co przyjete w Rails konwencje nazewnicze, kt. pozwalaja na unikniecie kilometrowych plikow konfiguracyjnych (xml czy yaml).

Jezeli tu jakas bzdure palnalem to prosze o korekte.

Wielkie dzięki za obszerną i klarowną odpowiedź :slight_smile:

Przyznam że zupełnie nie skojarzyłem tych “odbić” z “reflection”.

Pozdrawiam,
Paweł