Witam.
Na wstępie przepraszam, że zadaję drugi raz pytanie o mniej-więcej o to samo, ale we wcześniejszym wątku nikt nie odpowiedział, a ja przez ten czas nauczyłem się baardzo wiele Jednak do rzeczy:
cały czas rozchodzi się o to, żeby użytkownik miał wiele zdjęć - tu relacja has_many belongs_to sprawdza się świetnie - jednak na chwilę obecną to użytkownik może mieć nieskończenie wiele zdjęć (w teorii) - chciałbym to w jakiś elastyczny sposób limitować - tzn. najlepiej, gdyby po zmianie jedej zmiennej (trzymanej gdzieś w configu?) całość działała już na nowej wartości. Cud-miód, gdyby był to sposób, który w przyszłości umożliwiał utworzenie kategorii użytkowników, którzy mogą mieć N-zdjęć i dajmy na to 2N- zdjęć.
Z góry dziękuję za wszelkie odpowiedzi
Nie sądzę, żeby dało się to magicznie zrobić - ja bym wbudował to ograniczenie w kontrolera - który nie pozwalałby na dodanie więcej zdjęć niż dopuszczalne dla danej klasy użytkownika, i oczywiście w templace strony - w przypadku gdy użytkownik wgrał maksymalanie dużo zdjęc, nie pojawia mu się formularz do wgrywania kolejnych, tylko informacja, że nie może więcej zdjęć wgrywać.
Dodawanie logiki typu ile user może mieć max zdjęć to odpowiedzialność modelu a nie kontrolera czy templejta. Dlaczego nie kontrolera czy templejta ? Prędzej czy później kod który będzie odpowiedzialny za sprawdzanie czy user przekroczył max ilość zdjęć będziesz chciał wykorzystać w innych miejscach. Jeśli dodasz logikę do kontrolera czy templejta będziesz musiał ją kopiować do nowych miejsc przez co kod będzie trudniejszy w zrozumieniu i utrzymaniu. Zdefiniowanie jasnej odpowiedzialności umożliwi Ci np. później podmianę kodu sprawdzającego na taki który będzie pobierał max z pliku konfiguracyjnego/konfigu aplikacji czy z bazy danych tak jak wspomniałeś - będziesz to mógł zrobić bez konieczności zmiany kodu 3 kontrolerów i 5 templejtów (na przykład).
Zacznij od zdefiniowania w modelu użytkownika metody która zwróci max ilość zdjęć, sprawdzanie czy user przekroczył max ilość zdjęć umieść również w modelu, np. metoda user.reached_max_photos? albo user.more_photos_allowed? to już zaleźy od Ciebie. Polecam (już po raz setny chyba) nieśmiertelny zestaw screencastów o złożonych formularzach
Zrób walidację Usera lub UserImage blokiem kodu, który sprawdzi ile już jest dodanych obrazków. Najlepiej będzie chyba w walidacji lub before_save tego ostatniego, sprawdzić ile już istnieje zdjęć od tego samego usera i dodanie do obiektu errora (nie zapisze się / nie przejdzie walidacji) w przypadku before_save lub zwrócenie false w przypadku walidacji.
w kontrolera? rozważałem już sytuację,że magicznie tego nie będzie dało się zrobić, i myślałem wtedy, żeby w modelu zrobić before_save, i tam sprawdzić, czy jest to szósty element, czy nie(co prawda będę musiał pokombinować jak to zrobić, ale to już sobie jakoś poradzę
) mam jednak pytanie: gdzie można łatwo przechowywać taką zmienną przechowującą ilość zdjęć dla usera? czy w ror jest wbudowany jakiś mechanizm, który przechowuje dane konfiguracyjne?
Dopisano:
do dekalogu powinno się dopisać:
po jedenaste: odśwież stronę przed zaczęciem pisania odpowiedzi -moja dotyczy tylko od tomka1024 - resztę biorę sobie do serca, i zaczynam się bawić