Layout - pomoc

Witam

Mam pytanie jak wy to robicie

mam np kontroler news ktory wyswietla newsy oraz np kontroler photos ktory wyswietla zdjecia

i teraz chcialbym zrobic kontroler np main ktory w swoim widoku bedzie wyswietlac newsy oraz zdjecia

w jaki sposob moge to zrobic , czy moge jakos wywolac te kontrolery w widoku kontrolera main ale tak zeby w kontrolerze main nie tworzyc zadnych zmiennych zwiazanych z tymi 2 kontrolerami

jezeli moglby ktos mi to wytlumaczyc jak to sie robi bylbym naprawde wdzieczny

pozdrawiam

Mylisz lekko pojęcia modeli i kontrolerów.

Newsy i zdjęcia w aplikacji to modele. I nie ma nic złego w wykorzystywaniu modelu Photo czy News w kontrolerze main.

Według mnie bardziej chodzi ci o wykorzystanie partials, tj. w momencie gdy robisz widok do wyświetlania news to część która ma być wspólna wrzucasz do partiala(takie pliczki zaczynające się od “_” np. _show.html.erb . Następnie w widoku do kontrolera main załączasz taki partial. Podobnie robisz w przypadku photo.
http://guides.rubyonrails.org/layouts_and_rendering.html#using-partials

partiale swoją drogą, ale skadś jeszcze trzeba wziąć dane do nich

[code=ruby]#to masz w photos_controller
def index
@photos = Photo.find(:all) #niekoniecznie wszystkie :stuck_out_tongue:
end

#to masz w news_controller

def index
@news = News.find(:all)
end

#partial dla newsów może być czymś takim:

<% @news.each do |news|-%>

<%= news.title %>

<%= news.body %>

<% end -%>

dla photos analogicznie . . .

#a teraz chcac z wykorzystac kod ponownie zrób coś w tym stylu

main_controller

def index
@news= News.find(:all)
@photos = Photo.find(:all)
end

a w templacie do main/index.html.erb coś takiego

<%= render :partial=>“news/index” %>
<%= render :partial=>“photos/index” %>

nie jestem pewien czy mozna renderowac templatea z templatea ale pewnie tak, sprawdz sobie,

bo moze nie potrzebujesz tworzyc partiali[/code]

Dziekuje bardzo wam za pomoc pobrobuje w domu bo teraz w robocie jestem :slight_smile: ( jestem grafikiem )

moje pytanie drugie czy w rails jest cos takiego jak komponenty jak w symfony jesli tak to moze macie jakis link ktory pomoze
jak nie to wygooglam

dziekie wielkie za poswiecony czas

pozdrawiam

komponenty są - nazywają się gemami

@kalek http://cells.rubyforge.org/

@phocke - musialem uzyc partiala stworzylem w news plik _list.erb i jest ok , tyle ze partiale znam ale generalnie nie znam jeszcze dobrze railsa wiec moze chcialem przekombinowac generalnie np w symfony kumple robia jakos tak ze np w widoku jakimkolwiek chca moga sobie uzyc w smarty include_component i ten kontroler w ktorego widoku to robia nie musi miec nawet chyba tego @news= News.find(:all) a tu u nas main musi to miec ,

chodzilo mi to czy da sie jakos w railsach i jesli tak to jak zrobic tak ze np tworze sobie kontroler main i w jego widoku index wykonuje sobie jakiegos includa czy cos i wykonuje mi sie kod z kontrolera newsa czy jakis widok ale w main nic nie musze robic ?? oo i to jest moje pytanie :slight_smile: ?

bede wdzieczny za odpowiedz

@seban - dzieki za linka zapoznam sie na pewno

pozdrawiam

no to skorzystaj z linka sebana, albo zrób coś co nie jest ładne i nie “rails way”

[code=ruby]#dajesz finda w partialu (to jest ta brzydka rzecz)
<% Photo.find(:all).each do |img| -%>
<% link_to “obrazek” do %>
<%= image_tag img.public_path %>
<% end %>
<% end -%>

#nie testowane, więc może sypnąć jakimś syntaxem albo coś :stuck_out_tongue:
#pozniej renderujesz partiala gdzie tam chcesz i od razu śmiga[/code]

Dziekie wielkie za szybka odpowiedz i pomoc jak bedziesz miec jakis problem z grafika albo XHTML/CSS to wal :slight_smile:

jeszcze jakbys krotko mogl powiedziec dlaczego jest to brzydka rzecz :slight_smile:

Photo.find(:all).each do |img|

pewnie chodzi o tą część, bo to powinno być w kontrolerze a nie widoku

Pewnie tak :slight_smile: ok dzieki , wiec najlepsze rozwiazanie to te co podal seban ale to jeszcze jestem za kiepski :slight_smile: pozdrawiam i dzieki za pomoc wracam do ksiazki od Ruby
pozdrawiam ( programowanie co raz bardziej mi sie podoba )

[quote=gotar]Photo.find(:all).each do |img|

pewnie chodzi o tą część, bo to powinno być w kontrolerze a nie widoku[/quote]
Kontroler powinien wczytywać tylko jedną kolekcję, do tego tylko z modelu, który bezpośrednio obsługuje (@users w UsersController). Co więcej kontroler powinien ustawiać tylko jedną zmienną instancji (np. @user). Brzmi to rygorystycznie ale stosując się do tej reguły można tworzyć bardzo proste i łatwe w zmianie aplikacje.

Widoki mogą wyciągać dowolne dane z dwóch źródeł: z jedynej zmiennej instancji jaką ustawia kontroler (@user.photos) lub z PRZETESTOWANYCH metod klasy modelów (np. named scopes: Photos.all). Oczywiście ręczne użycie find() w widoku odpada.

Partial, który sam wyciąga dane z named scope można bez zmian użyć w wielu miejscach. Można go też bez problemu wrzucić w cache.

Z kolei jeśli trzymasz się kurczowo zasady, że wszystkie kolekcje wolno wczytywać tylko w kontrolerze to dodajesz sobie pracy. Musisz je wczytywać w każdym kontrolerze, którego widok chce użyć partiala (lub posłużyć się filtrem). I oczywiście to przetestować, w każdym kontrolerze. Tworzy się bałagan i duża, nikomu nie potrzebna zależność pomiędzy kontrolerem a partialem. No i nie da się tego już w prosty sposób cache’ować.

Podsumowując: zamień Photo.find(:all) na Photo.all i możesz tego swobodnie użyć w parialu.

Trochę nie rozumiem tej logiki :slight_smile:

Tzn. Photo.find(:all) vs Photo.all. Wiem, że Photo.all wygląda ładniej, nie ma nawiasów i może się wydawać, że nic tam dopisać nie można, ale prawie każdy wie, że i tak mogą tam dopisać Photo.all(:conditions => {:foo => “bar”}), albo w nowych Railsach Photo.where(:foo => “bar”).all.

W każdym razie oprócz wyglądu nie wydaje mi się, żeby zamiana find(:all) na all cokolwiek dodaład do aplikacji :wink:

Oj, Bragi. Przecież .all jest aliasem do find(:all). Jedno i drugie użyte w widokach jest tak samo brzydkim manewrem z punktu widzenia MVC.

Albo zmienne z kontrolera, albo robisz komponenty narzędziem do tego przeznaczonym (cells). Inne metody są niekoszerne. :wink:

Bragi, skąd się to wzięło? Zgodzę się że tak powinno być w 90% przypadków, ale jak masz DashboardController, który wyświetla artykuły, newsy i najnowsze komentarze obok siebie to dlaczego nie ustawiać 3 zmiennych instancyjnych? Trzeba wiedzieć kiedy zrobić wyjątek od reguły.