Problem prawdopodobnie trywialny, ale szarpię się z nim od paru godzin a wg. googla nie tylko ja mam z tym problem, a dużo początkujących użytkowników Railsów.
I nie znalazłem nigdzie rozsądnej odpowiedzi.
Mogę go przedstawić w dwóch ujęciach.
Mam tabelę w bazie nie związaną w żaden sposób z modelami i kontrolerami aplikacji railsowej.
Tabela jest zasilana danymi przez zewnętrzny skrypt.
Ujęcie pierwsze:
Jak w widoku aplikacji railsowej “wyciągnąć” te dane.
Testowo (tylko proszę się nie śmiać) wpisałem sobie w widoku całe połączenie z bazą i selectem wyciągam te dane i je wyświetlam - i to działa.
Tyle, że jak się domyślam, trudno to nazwać profesjonalnym programowaniem. Prawdopodobnie trzeba by napisać tutaj sobie helper.
Wymyśliłem sobie więc trochę inaczej - dopisanie całego modelu z kontrolerem wygenerowane za pomocą scaffolda (tylko index i show), potem poprawiłem w tym co teoretycznie trzeba i to też działa… teoretycznie.
Ujęcie drugie:
Jak wyświetlić widok z modelu jako “partial” bez konieczności dopisywania w każdym kontrolerze aplikacji definicji dla tego obiektu.
Chcę mieć wyświetlany “index” lub “show” w głównym layoucie aplikacji gdzieś z boku, ma się wyświetlać zawsze, bez względu na to, jaki kontroler zostanie uruchomiony.
Bo na chwilę obecną działa to jedynie wtedy, gdy do każdego kontrolera aplikacji dopiszę definicję obiektu. Czy tylko tak to zadziała?
Ok, ale czy to oznacza to co napisałem, że “partiale” nie są aż tak “sophisticated” i bez dopisywania definicji obiektu dla wszystkich kontrolerów aplikacji nie obsłużą tego?
Wyobrażałem to sobie tak, że skoro wywołuję w layoucie partial “widokmojegomodelu/index” to definicja tego index’u uwzględnia automatycznie kontrolery z “mojegomodelu”.
To może zadam trochę inne pytanie.
Mam środowisko wieloużytkownikowe, model “post” i zdefiniowany w kontrolerze @licznik, który zlicza ilość postów dla danego użytkownika.
Czy da się wyciągnąć ten @licznik jako partial bez grzebania po innych kontrolerach - chodzi o wyświetlenie tego @licznika gdzieś z boku, żeby użytkownik widział go po zalogowaniu w każdym momencie, aż do momentu wylogowania. Bo jeśli muszę do każdego kontrolera aplikacji podawać definicję tego @licznika to tak jakoś trochę … dziwnie.
module PostHelper
def post_count
n = current_user.posts.count
content_tag :div, n
end
end
ale dla mnie pobieranie jakichś rzeczy w helperze to nie jest odpowiednia droga - lepiej załatwić to przed dekorator/prezenter albo właśnie takie komponenty jak cells
[code=ruby]class PostCountCell < Cell::Base
def display @count = current_user.posts.count
render
end
end
/app/cells/post_count/display.html.erb
<%= @count %>
/app/views/layouts/application.html.erb
<%= render_cell :post_count, :display %>[/code]
po prostu składasz stronę z różnych niezależnych od siebie “klocków”
Nie przyglądałem się jeszcze dokładnie cellsom i apotamo, ale z tego kodu co podałeś to właśnie o coś takiego mi chodzi.
Kurczaki, to powinno być zaimplementowane w Railsach w core
Coś na zasadzie globalnego kontrolera aplikacji, gdzie by właśnie się definiowało takie potrzebne kwiatki do kożucha.
Dzięki za pomoc, chociaż nie ukrywam, że odczucia mam ambiwalentne - sądziłem, że Railsy są trochę bardziej zaawansowane i nie trzeba się chwytać lewą ręką za prawe ucho.
To jeszcze jeśli mogę prosić o rade, oszczędź mi losu osiołka co mu w żłob dano - cellsy czy apotamo? Apotamo to cellsy wzbogacone o javascript?
jedno i drugie każde jest trochę do czego innego i zazwyczaj w projekcie mam oba.
cells jest dobre do rzeczy w miarę statycznych - pobierz i wyświetl. czyli jakieś najnowsze artykuły, najnowsze komentarze itp.
apotomo jest do rzeczy bardziej dynamicznych - formularze wysyłane w tle, jakieś rzeczy drap&drop
apotomo wymaga wpięcia się w konkretne kontolery żeby mogło działać w ich akcjach. to zawsze trochę więcej kodu, który czasami po prostu jest niepotrzebny bo wystarczy użyć cells