Organizacja aplikacji - pytanie od początkujacego

Witam,

Na wstępie chciał bym przywitać wszystkich forumowiczów!

Od miesiąca angażuję się mocno w poznanie RoR. Idzie mi całkiem nieźle, lecz na etapie każdych “projekcików” mam problemy, które pojawiają się w każdej zaczętej przezemnie aplikacji.

Za każdym razem tworzone aplikacje są prostymi blogami, fotoblogami itp. Problem, który pojawia mi się co krok to tak naprawdę znikające obiekty, stąd moje pytanie

  1. Czy tworząc aplikacje gdzie mamy 2 kontrolery, Fotografia oraz Blog chcąc stworzyć komentarze, to lepiej stworzyć 3 kontroler (logicznie myśląc) , który obsłuży cała logikę ale mam problem z zmiennymi zainicjowanymi w pozostałych kontrolerach czy też w każdym kontrolerze obsługiwać komentarze ?

Jak wybiorę opcję pierwsza mam niestety problem z obiektami i zainicjowanymi zmiennymi, np gdy formularz zostanie błędnie wypełniony, nie jestem w stanie wyświetlić błędów z modelu. Poniżej przedstawiam kod:

Kontroler project

def wyswietl @project = Project.find_by_id_and_active(params[:id], 1 ) if @project == nil @project = Project.find_by_titleUrl_and_active(params[:id], 1) if @project == nil flash[:notice] = "Ups..Taki projekt nie istnieje :(" redirect_to "/projekty" end end
Widok wyswietl.html.erb

[code]

           <div class="title">

            	<p><%= @project.title %> </p>

           </div>

           <div class="main_text_capital">
                 <%= @project.shortDescription %>
           </div>

           <div class="main_text">
              <%= sanitize @project.description, :tags => "div, img, p" %>


           </div>

<% if flash[:notice] %>


<%= flash[:notice] %>


<% end %>
<%= render :partial => "komentarz/comment_form", :locals => {:comment => Comment.new, :project_id => @project.id, :gallery_id => 0 } %>
[/code] Partial _comment_form.html.erb

[code]<%= form_for(comment, :url => {:controller => “komentarz”, :action => “nowy”}) do |f| %>
<% if comment.errors.any? %>


<%= pluralize(:comment.errors.count, “error”)%> prohibited this comment from being saved:

      <ul>
        <% comment.errors.full_messages.each do |msg| %>
            <li><%= msg %></li>
        <% end %>

      </ul>
    </div>
<% end %>


<%= f.hidden_field :project_id, :value => project_id %>
<%= f.hidden_field :gallery_id, :value => gallery_id %>
<p>Nick:</p> <%= f.text_field :nick %>
<p>Komentarz:</p> <%= f.text_area :description %>
<%= f.submit "Dodaj" %>

<% end %>[/code]
Prawidłowe wypłenienie formularza do komentarza wyświetla wszystko tak jak trzeba, lecz gdy wypełnię go źle, nie dostaje komunikatów z
<% if comment.errors.any? %>

Wiem, że render generuje tylko widok akcji a nie samą akcje , więc zawsze tam gdzie będą rendery muszę raz jeszcze tworzyć wszystkie operacje związane z danym widokiem ?

W przypadku gdy kontroler komentarz z akcja nowe wywoła render to w linku widzę już strona/komentarz/nowe zamiast blog/1 - można to jakoś zamaskować ?

Dzięki z góry za pomoc.

Tak na początek to pooglądaj rózne filmy od Rayan a przede wszystkim o:
http://railscasts.com/episodes/154-polymorphic-association

Ja zaś odradzam polimorficzne asocjacje z zasady :slight_smile:

paneq, dlaczego?

Nic nie zyskujesz dzięki nim. Jeśli mam trzy rzeczy które wymagają komentarzy i wszystkie zachowują się tak samo to wolę potworzyć kilka tabel, modeli, kontrolerów i routes’ów, wspólną część implementacji wyciągnąć do modułów i z punktu widzenia wszystkiego na zewnątrz traktować jakby te rzeczy się jednak różniły. Dzięki temu jak później się zmieniają wymagania to nie mam żadnego problemu. Miałem N różnych punktów wejścia dla funkcjonalności, które prowadziły zawsze do tego samego zachowania a teraz wystarczy, że będą prowadzić do różnych. No i nie mam problemów z constraintami na bazie.

Mam spaczony punkt widzenia który bardziej patrzy w kierunku długoterminowego utrzymania aplikacji (X lat) niż aktualnej implementacji. Po prostu nie wierzę, że polifmorficzne komentarze da się utrzymać w tak długim okresie czasu. Na pewno za pół roku już będą one działać inaczej :slight_smile: Prawie nic to nie kosztuje (w sensie czasowym) rodzielenie tego wszystkiego a później w razie czego łatwo można zmienić działanie tylko w jednym miejscu jeśli zachodzi taka potrzeba.

To tylko takie moje skromne zdanie…

Ja do takich rzeczy używam ajaxa.
Nie ma problemu z urlem i w ogóle jest ślicznie :slight_smile:

+1

Dzieki za odpowiedz. Zastanowie sie troche zanim znow uzyje polimorficznej asocjacji :wink:

Myślę, że na tym etapie nauki powinieneś przerobić oba podejścia i wyrobić sobie pogląd.
Przy czym zdecydowanie nie chodzi tu o to abyś np w blogs_controllerze obslugiwal od razu komentarze do niego - to powinno być realizowane w osobnym kontrolerze komentarzy, a czy on będzie jeden dla polimorfii czy wiecej to (per każdy komentowalny byt w systemie) to już zależy od Ciebie.

Jak powyższa dyskusja wskazuje są przeciwnicy i zwolennicy polimorficznych resource’ów

Czas Cię nie goni więc możesz testować :wink:

Często przerobienie obu przypadków niewiele dalej bo nie natkniesz się samemu na sytuacje w której użycie drugiej drogi daje Ci jakieś wymierne korzyści. Jeśli na prostym projekcie typu blogasek plus komcie ćwiczysz to co za różnica windows czy linux, active record czy sequel, mongo czy sql, mysql czy db2, prototype czy jquery, erb czy haml itd Możesz spróbować i zobaczyć co personalnie bardziej Ci odpowiada ale zapewne nie jest to usecase w którym jedno albo drugie jakoś lepiej się sprawdza i warto tego użyć z tego powodu :slight_smile: Dlatego warto czytać różne opienie różnych osób i brać poprawkę na ich wymagania.

Wow… Dzięki za odpowiedź :))) po prostu widzę , że wiele przede mną

Nie chce zakładać nowego topica, więc dopisze do tego.
Mianowicie powalczyłem dzisiaj z Ajaxem , proste wywołanie link_to aby “przeskoczył” do odpowiedniej akcji, podmienił wartość zmiennej i wyświetlił na ekranie .

application.js

$.post("/test/update") .success(function() { $("#wynik").html("<%= escape_javascript(render(@test))%>"); }
Rezultat:
<%= escape_javascript(render(@test))%>

Wyczytałem, że znaczniki <% %> mogą być tylko renderowane w widokach *.erb

Zatem, do swojej akcji dorobiłem

respond_to do |format| format.html format.js end
Niestety chodżbym nie wiem jak się starał za nic nie mogę dostać się do nazwa_akcji.js.erb, nawet najprostrzy alert(“dupa”); nie zadziałał :slight_smile:
W czym może być problem ?

Rails 3
Gem jquery-rails

Dzięki

[quote=Quizer]Niestety chodżbym nie wiem jak się starał za nic nie mogę dostać się do nazwa_akcji.js.erb, nawet najprostrzy alert(“dupa”); nie zadziałał :slight_smile:
W czym może być problem ?[/quote]
No a w logach serwera co Ci renderuje w takim przypadku?

Wychodzi na to, że po zmianie w kontrolerze , jeżeli chodzi respond_to należało zrestartować serwer… nic innego mi do głowy nie przychodzi dlaczego to nagle ezaczeło działać - fakt był taki , że wyłączyłem RubyMain i włączyłem znów ten projekt.

Wracając jeszcze do polimorfii: stosowanie osobnych modeli komentarzy do różnych modeli ma taką wadę, że nie da się w optymalny sposób pobrać i wyświetlić np. “10 ostatnich komentarzy w serwisie” albo “5 najnowszych komentarzy użytkownika X”. Am I right?

Myślę, że wymagałoby to po prostu jednego warunku więcej do where()…

Zignoruj tą wiadomość, źle zrozumiałem pytanie.

Raczej n więcej złączeń, patrząc na to tak, że każdy model do komentowania jakiejś rzeczy będzie miał osobną tabelę w bazie. Więc utrudnia to takie operacje jak ostatnie komentarze na stronie itp.