Dość nietypowy problem jak dla początkującego

Witam wszystkich serdecznie :slight_smile:

Mam dość nietypowy problem. Jak wyświetlać ‘list’ (controller ogloszenia) tak żeby cały czas był widoczny w jednym miejscu, mimo iż przeglądam np show (controller plyty).
Bardzo Was prosze o pomoc. Już nie moge przez to spać :slight_smile:
Mam nadzieję, że wystarczająco jasno opisałem problem.

I jeszcze jeden mały problem. Jak to zrobić, że wpisująć w formularz jakiś dłuższy tekst i dając enter po wyciągnięciu z bazy tego np. newsa, ten enetr był widoczny ( w sensie złamanie lini).

Jeszcze raz proszę Was o pomoc

Pozdrawiam
Łukasz

Podaj definicje tabeli, z której pobierasz dane. Może masz źle zdefiniowany typ danych. Inna sprawa, że “Enter” czyli “\n” nie jest znakiem HTML - nie wyświetli się. Może powinieneś sparsować tekst i zamienić “\n” na “
”.

Polecam API: textilize (ActionView::Helpers::TextHelper)

Nic nie stoi na przeszkodzie byś “show” dołączył do ogłoszeń, kontrolerze ma odzwierciedlać stronę prezentacyjną aplikacji. Przypuszczam jednak, że “show” jest Ci także niezbędne w kontrolerze płyty. I jak rozumiem chcesz się zachować DRY :slight_smile: A to zaleta :slight_smile:

Jak dobrze zrozumiałem chcesz mieć controller ogloszenia:

[code=ruby]# …
def list

@rows.find_all

end[/code]
i wyświetlić template _list.rhtml:

[code=html]


<%= render :partaial => “list_row”, :collection => @rows -%>

[/code] Proponuje zawartość details aktualizować ajaxem. Template _list_row.rhtml:

[code=html]


  • <%= link_to_remote (list_row.name, :controller => ‘plyty’, :action => ‘show’)
[/code] W kontrolerze plyty musisz sprawdzić czy wywołanie jest ajaxowe (request.xhr?) i wtedy zaktualizować div id=elem_details odpowiednimi danymi.

ps. Radze pozmieniać nazwy kontrolerów na EN - po pierwsze łatwiej się ich używa w rubim (magia :wink: ); po drugie jesteś nie konsekwentny plyty.show() źle to wygląda

tak myślałem, że źle sprawę naświetliłem (chyba, albo nic nie rozumiem :))
http://wierzba.wzks.uj.edu.pl/~jecek/zl1.jpg - to jest layout do stronki. Tam gdzie jest “okienko” OGŁOSZENIA chciałbym żeby cały czas się wyświetlały tytuły ogłoszeń. Tam gdzie jest napisane o POMOCY na środku były wyświetlane wszytkie inne informacje np. Twórczość, Życie itp. a po kliknięciu w tytuł ogłoszenia i ono powinno się wyświetlać na środku.

Poradzicie coś? Proszę :slight_smile:
Pozdrawiam
Łukasz

Kiedyś do tego typu rzeczy używało się funkcji Rails o nazwie components, ale już od dawna wszyscy starają się zapomnieć że coś takiego w ogóle istniało (okazało się złym pomysłem). Ja bym to zrobił tak:

  1. Dla każdej akcji musisz pobrać tytuły najnowszych ogłoszeń. Najlepiej zastosować do tego filtr, coś w rodzaju:

[code]class FooController < AR::Base
before_filter :get_news

def index
# tutaj cokolwiek, na przykład pobranie najnowszych postów albo po prostu nic
end

private

def get_news
@news = News.find_latest # takiej metody oczywiście nie ma, możesz ją utworzyć w modelu, albo tutaj dopisać
# odpowiednie :conditions do zwykłego find
end
end[/code]
Teraz już każda wyrenderowana akcja pobiera z bazy danych ogłoszenia, więc pora przejść do punktu drugiego:

  1. W layoucie dopisz w miejsce Ogłoszeń coś w rodzaju:
  <%= render :partial => "news", :collection => @news %>

Sam kod wypisujący same tytuły jeden pod drugim musisz zawrzeć w partialu.

Pozdrawiam,

Benol

Twoje pytania zostały dobrze zrozumiane. Marcin konkretnie na oba odpowiedział. Być może trochę brakuje Ci podstaw (wnioskuję po używaniu polskich identyfikatorów).

To co chcesz zaimplementować, to webowe master-details. “Master” to list ogłoszeń, “details” to szczegóły klikniętego ogłoszenia (lub ew. inna treść).

Zrób stronę, która wyświetla listę ogłoszeń. Wywołanie obsłuży metoda NewsController#list. Wyświetli je widok news/list.rhtml.

Zrób oddzielną stronę, która wyświetla szczegóły konkretnego ogłoszenia. Wywołanie obsłuży metoda NewsController#show. Wyświetli je widok news/show.rhtml.

W zasadzie, to wszystko możesz zrobić automatycznie przez scaffolding. Jeśli będziesz pewien, że dokładnie to wszystko rozumiesz, możesz pomyśleć o umieszczeniu obu rzeczy na jednej stronie.

Wyświetlenie na jednej stronie różni się głównie tym, że każde ogłoszenie na liście nie jest zwykłym linkiem, tylko kodem JavaScript. Ten kod pobiera z serwera szczegóły ogłoszenia (woła NewsController#show) i wstawia wynik w określone miejsce na istniejącej stronie (wszystko bez przeładowania tej strony). To tak na poziomie idei.