Zmiana koloru czcionki przez controller lub model

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

To mój widok.

[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] <%= seat.position %> <% if i >=3 %>
<%= seat.user.username %>
<%= seat.user.username %> <% end %> [/code]

No i widzę że się zrozumieliśmy ;]

Dzięki wielkie za szybką odpowiedź.

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.

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

>aaa

już lepiej dać if jak dla mnie zwykły

[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.

Zapisałbym tylko w widoku:

[code]<div class="<%= seat.reserved? ? “reserved” : “” %>">

<%= seat.user.username %>
[/code]

quote=sevos
Zapisałbym tylko w widoku:

[code]<div class="<%= seat.reserved? ? “reserved” : “” %>">

<%= seat.user.username %> [/code] [/quote] +1, ale ja bym napisał [code]
"> <%= seat.user.username %>
[/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 ;)