Przekazywanie zmiennych

Byłabym wdzięczna za podpowiedz w następującym problemie.

Mam założone 3 kontrolery i napisaną do nich obsługę zdarzeń natomiast chciałabym aby stronki z tych kontrolerów(np indexy baz) były wyświetlane na 1 stronie w ramach przypisanych sobie div’ow . I tu przy wykorzystaniu np: 'render :template=>‘kontoler2/index’ pojawia się problem z przekazywaniem zmiennych instancji np: @item do kontrolera trzymającego stronki statyczne. Jak to rozwiązać prawidłowo, przepisanie tych zmiennych do głównego kontrolera rozwiązuje problem ale domyślam się, że nie tędy droga :)?


Czy mogłabyś opisać jakoś inaczej swój problem, bo co najmniej 3 osoby przeczytały Twojego posta, i kompletnie nie mają pojęcia o co Ci chodzi :wink:

oj ta kaczka naprawdę nie była potrzebna :frowning:

  1. Zakładam kontroler Rowery do obsługi bazy z rowerami
    2 Zakładam kontroler Samochody do obsługi bazy z samochodami
  2. Zakładam kontroler Samoloty do obsługi bazy z samolotami

osobno wywoływane htmle z view indeksują te bazy dodają nowe itd. wszystko pieknie

  1. Zakładam kontroler do obsługi strony statycznej na której chcę wyświetlać odświeżone wykazy baz lub wprowadzać formatki z dodawaniem pozycji pozostawiając widoki wszystkich baz.

I tu pojawia mi się problem z przekazywaniem zmiennych instancji.Np: @rower = Rower.find(params[:id]) nie jest widoczny gdy renderuję akcję z innego kontrolera
Jak przygotować w rails stronę wyświetlającą strony akcji różnych kontrolerów w tym samym czasie

render :template=>'samoloty/index'
render :template=>'samochody/index'
render :template=>'rowery/index'
... no teraz chyba lepiej nie opisze....

to co robisz powinna jak juz zrobić przy użyciu parial, poczytaj wprowadzenie do rails (guide) i przekazac sobie ta zmienna do widoku,

Na sile mozesz zrobic sobie kontroler statyczny jakis a w nim akcje aaa ktora ma
@rower = Rower.find(…)
@sam = Sam.find(…)
@pila = Pilka.find(…)

i wtedy te 3 zmienne bedziesz miala dostepne, ale dobrze tego nie robisz. Nie jest to rails way. Poczytaj sobie wprowadzenie do rails i objrzyj troche screencastów od Rayana, to sie wyjasni samo na pewno

nie da się. tzn. nie tak jak chcesz to zrobić. Musisz użyć partiali (+ jakiś pomocniczy helper) lub cells

[code=ruby]module ApplicationHelper
def bikes_widget(bikes = nil)
bikes ||= Bike.all
render ‘shared/bikes’, bikes: bikes
end
end

app/views/shared/_bikes.html.erb

<% bikes.each do |bike| %>
<%= bike.name %>
<% end %>

w widoku:

<%= bikes_widget %>
<%= bikes_widget Bike.all %>
<%= bikes_widget @bikes %>[/code]

Właśnie moje pytanie dotyczyło jak uniknąć przepisywania tych zmiennych, zresztą mogą one przecież ulegać zmianie przy wywoływaniu innych akcji z “podkontrolera” Czy wywałanie akcji z 2 baz, wyrenderowanie wyników na jednej stronie jest w railsach tak mozolne,że odsyłacie mnie do przejscia przez screancasty?

Chodzi tylk obyś zrozumiała idee, bo na razie nie rozumiesz i próbujesz coś robic pod góre. To co chcesz osiągnąc da się zrobić dość prosto ale nie tak jak ty to chcesz to zrobić. Dlatego bez zrozumienia podstaw się nie da. Nie ma drogi na skróty, zacznij od podstaw rails guide, pozniej proste screen casty i kursy, blogi w 15 minut itp a pozniej coraz trudniejsze rzeczy.

Na tutorialach o jakich piszesz wszystko opiera się o akcje w ramach jednego kontrolera lub asocjacjach i wywoływaniu zapytań powiązanych, jest to dla mnie oczywiste. Nie rozumie jednak ‘drogi rails’ jeżeli muszę wywołać na 1 stronie akcje indeksowania z 2 niezależnych i nie połączonych baz jakie są już realizowane w projekcie. Będę głęboko zobowiązana za linki rozwijające ten temat :slight_smile:

Ogólnie w Rails działa schemat: Jedno żądanie - jedna akcja konkretnego kontrolera (pomijając, oczywiście, żądania asynchroniczne). Zatem jeśli chcesz zrobić taki widok “zbiorczy”, w którym wyświetlisz zarówno rowery (np.), jak i samochody, powinnaś stworzyć odpowiedni kontroler, w jego obrębie odpowiednią akcję - i w kodzie tej akcji wpisać powiedzmy:

@cars = Car.all @bikes = Bike.all
.
W ten sposób wyciągniesz z bazy interesujące Cię rekordy - udostępniając je jednocześnie (jako zmienne instancji kontrolera) widokowi.

I tak jak napisał gotar: Zacznij od jakichś poradników - Rails guides, czy też świetnego tutoriala: http://ruby.railstutorial.org/ruby-on-r … orial-book - w celu załapania podstaw - a później zapraszam z konkretnymi pytaniami.

A ja bym do sprawy podszedł od innej strony - zastanów się, czy faktycznie na jednej stronie chcesz wyświetlać obiekty różnego typu.

Jeśli tak - to być może nie są to obiekty różnego typu, tylko mają typ wspólny - np. środek transportu. A wtedy można dodać klasę nadrzędną, która lepiej będzie nadawać się do użycia w tym konkretnym scenariuszu.

Jeśli nie - to prawdopodobnie projekt interfejsu jest nienajlepszy. Tzn. serwowanie użytkownikowi naraz informacji o wielu różnych typach obiektów powoduje zamęt. Tak jak na poziomie klas powinno się dążyć do tego, żeby posiadały one jedną, dobrze zdefiniowaną funkcjonalność, tak na poziomie interfejsu użytkownika powinno dążyć się do nierozpraszania go zbędnymi informacjami.

Rozmowa z Wami rozjaśnia mój dzień:). Teraz to już nie są rozważania czy można ale czy chcę xd :)))))

[quote=anna]Byłabym wdzięczna za podpowiedz w następującym problemie.
Mam założone 3 kontrolery i napisaną do nich obsługę zdarzeń natomiast chciałabym aby stronki z tych kontrolerów(np indexy baz) były wyświetlane na 1 stronie w ramach przypisanych sobie div’ow . I tu przy wykorzystaniu np: 'render :template=>‘kontoler2/index’ pojawia się problem z przekazywaniem zmiennych instancji np: @item do kontrolera trzymającego stronki statyczne. Jak to rozwiązać prawidłowo, przepisanie tych zmiennych do głównego kontrolera rozwiązuje problem ale domyślam się, że nie tędy droga :)?[/quote]

[quote=Lypa]@cars = Car.all @bikes = Bike.all
W ten sposób wyciągniesz z bazy interesujące Cię rekordy - udostępniając je jednocześnie (jako zmienne instancji kontrolera) widokowi.[/quote]

… czyli biez wodki nie razbieriosz.

[quote=anna]I tu pojawia mi się problem z przekazywaniem zmiennych instancji.Np: @rower = Rower.find(params[:id]) nie jest widoczny gdy renderuję akcję z innego kontrolera
Jak przygotować w rails stronę wyświetlającą strony akcji różnych kontrolerów w tym samym czasie

render :template=>'samoloty/index'
render :template=>'samochody/index'
render :template=>'rowery/index'
... no teraz chyba lepiej nie opisze....[/quote] Wywołanie render :template/:action/:file powoduje tylko wyrenderowanie podanego widoku. Akcja nie jest wywoływana, więc nie jest dziwne, że "nie widać zmiennych instancji", które są ustawiane w kontrolerze.

Masz kilka możliwości.

Sposób 1. Dodajesz nową akcję, “show_all” i w niej:

def show_all @bikes = Bike.... @cars = Car.... end
W widoku to co proponowałaś (czyli renderowanie widoków innych akcji).
Jednak to nie jest za dobra praktyka, gdyż te wszystkie widoki mogą zawierać jakieś elementy, które nie powinny się dublować na stronie (np. nagłówek, flash messages, includowanie js itp).

Sposób 2 (lepszy):

Wydzielasz sobie partiale, osoby dla każdego rodzaju, np. _car.html.haml, _bike.html.haml.

Akcja show_all taka jak w sposobie 1. Widok natomiast jest osobny, ale korzysta z tych partiali.

Oczywiście partiale ładnie wchodzą ale ich celem jest o ile pamiętam zwiększenie czytelności kodu oraz unikanie jego duplikacji i z partialami nie wychodzę poza kontroler. Mi chodziło o konkretny przypadek mam gotowy projekt bazy layouty, mam szybko wygenerować dane.Wiem, wiem uparta ze mnie (…) wyciągnęłam zmienne instancji do zmiennych globalnych uzależniając ich wartości przypisania od wywołania określonej akcji przez podkontroler i działa. Domyślam się, że to nie rails way jak to ktos dzisiaj pięknie napisał ale cuz spać nie mogę jak nie ma na ekranie czegos co chciałam zrobić xd.

teraz chce to ubrać w ajaxa, zna ktoś jakiś dobry tutorial do rails 3, muszę używać js czy ror ma wewnętrzne wywołania?

pozdrawiam
Ania

http://railscasts.com/episodes?utf8=✓&search=javascript i tak dalej ogólnie od 1 do teraz, poświęć te kilka dni życia, później będzie dużo łatwiej

Imho ogładanie railscastów od początku do końca jest bez sensu - po pierwsze, że niektore są już przestarzałe, a po drugie one z reguły rozwiązują jakieś konkretne scenariusze, to nie jest tutorial.

Ale każdy to jakaś porcja nieocenionej wiedzy, a jak jakiś ma nowszą wersję to jest o tym info. Jak dla mnie na pewno warto poświecić kilka dni i się przez nie przekopać

to js nie ajax w rails

ajax tez tam jest na screencastach nie miałem czasu szukać, ale jak przejrzysz lub skorzystasz z wyszukiwania to bedzie

ukłony dla zlw