Witam, chciałbym aby w poniższym kodzie zamiast wyświetlania błędu “Zbyt duża ilość użytkowników” każdy użytkownik na liście powyżej limitu(event.limit_event) był wyświetlany innym kolorem lub został zamknięty w jakimś DIVie. Gdzie znaleść jakiś tutorial tego dotyczący?
LIMIT = 3
user1
user2
user3
- user4
- user5
[code=ruby]# SEAT CONTROLLER
if @seat.save
if @seat.event.id == 1 @seat.move_to_bottom
else
if @seat.event.previous.seats.where(:user_id => @seat.user_id).exists? @seat.move_to_bottom
else @seat.move_to_top
end
end
end
SEAT MODEL
def validate
if event.seats.size >= event.limit_event
errors.add_to_base(“Zbyt duża ilość użytkowników”)
end[/code]
nie potrzebujesz do tego controllera czy modelu, to widok (css sam wystarczy w sumie), robisz sobie jakaś klasę np .rezerwowa o jakimś kolorze
w widoku dajesz
[code=ruby]- users.each_with_index do |user,i|
if i >=3
.rezerwowa= user.costam
else
= user.costam[/code]
Coś w tym stylu, nie wiem za bardzo co chcesz osiągnąć. Ale klasa w css to wszystko co ci trzeba, czy wrzucić ja w rby, czy js, czy cos tam inego to już twoja brożka
[code=ruby]<% seats.sort_by{|seat| seat.position}.each do |seat| %>
<%= seat.position %>
<%= seat.user.username %>
<% end %>[/code]
[b]Rozwiązanie:[/b] Pierwszą linijkę zmieniam na <% seats.sort_by{|seat| seat.position}.[b]each_with_index do |seat,i|[/b] %>
Oraz dodaję instrukcje warunkową:
[code=ruby]
Można czemu nie, tylko jak dla mnie trzeba myśleć czy się nie robi przerostu formy nad treścią. Erb zawsze zaciemnia sprawę. Równie dobrze bez zaśmiecania modelu mozna to zapisać inaczej i tyle:
....each_with_index do |user,i|
.a= user if i > 3
.b= user if i <=3
i tak dalej … kwestia zapisu
Sytuacja się znienia jak gdzieś indziej jeszcze to będzie używane, wtedy taki helper może się przydać i może to mieć sens.
Chociaż przyznam się że jestem przeciwnikiem takiego zaciemniania jak to powyżej czyli
[quote=pplcanfly]A gdyby tak umieścić tą logikę w modelu Seat:
def reserved?
self.position >= 3
end
i w erb coś w stylu:
[code]
<%= seat.user.username %>
</div[/code]
To bardziej moje pytanie niż sugestia:) Cały czas ten if co prawda zostaje, ale jakos mniej zaciemnia erb.[/quote]
Kwestia jeszcze priorytetów, możesz nawet stworzyć metody, które odpytują kolejno każdego członka listy oddzielnie.
Problem w tym, że każda taka metoda generuje kolejne pytanie do bazy danych. W powyższych przykładach bierzesz jednym zapytaniem wszystkie rekordy i w widoku je odpowiednio dekorujesz. W proponowanym rozwiązaniu generujesz nowe zapytanie do bazy niby też się da, ale po co?
[quote=marioosh][quote=pplcanfly]A gdyby tak umieścić tą logikę w modelu Seat:
def reserved?
self.position >= 3
end
i w erb coś w stylu:
[code]
<%= seat.user.username %>
</div[/code]
To bardziej moje pytanie niż sugestia:) Cały czas ten if co prawda zostaje, ale jakos mniej zaciemnia erb.[/quote]
Kwestia jeszcze priorytetów, możesz nawet stworzyć metody, które odpytują kolejno każdego członka listy oddzielnie.
Problem w tym, że każda taka metoda generuje kolejne pytanie do bazy danych. W powyższych przykładach bierzesz jednym zapytaniem wszystkie rekordy i w widoku je odpowiednio dekorujesz. W proponowanym rozwiązaniu generujesz nowe zapytanie do bazy niby też się da, ale po co?[/quote]
Herezja, jak zwykła pisać mi na klasówkach moja nauczycielka historii w liceum ;). Nie generuje się kolejne zapytanie do bazy danych. Zauważ, że self.position jest już ustawiane przez ActiveRecord w momencie ładowania obiektu z bazy danych, czyli np. #find().
Rozwiązanie pplcanfly jest IMO najlepsze, ponieważ to przenosi logikę biznesową do modelu.
Gdyby w przyszłości zmieniły Ci się zasady określania rezerwacji, zrobisz to w modelu, a nie w 50 widokach.
[/code]
a już wogóle najlepiej to chyba przenieść to do helpera. Dzięki temu znowu, gdy coś się zmieni, to zmieniasz tylko raz w helperze,zamiast 100 razy w widokach ;)