Mam formularz służący do wprowadzania limitów dla użytkowników zbudowany na bazie modelu UserLimit.
Formularz działa, rekordy się aktualizują ale … chciałbym aby działała walidacja wprowadzanych danych. Walidacja na poziomie modelu działa i w @user_limits mam komunikaty błędów ale jak je wyświetlić? Standardowe <%= error_messages_for :user_limits %> nie działa. Próbowałem na różne sposoby dodać :object ale nie tędy droga bo tworzy się tablica tablic. Jak sobie z tym poradzić?
Hm, coś mętnie tłumaczysz. Rozumiem, że wiesz jak działa standardowa walidacja i wyświetlanie błędów dla modeli AR?
Wyobraź sobie, że jesteś mechanikiem samochodowym. Samochód mi się zepsuł więc dzwonię do Ciebie:
-Dzień dobry, samochód mi się zepsuł
-Dzień dobry, ale co się dzieje?
-Nie jedzie. Próbowałem nawet go odpalić, ale on nie jedzie.
-<reakcje mechanika dopisz sobie sam;)>
W zasadzie masz rację. Tylko jak zadać pytanie? Validacja jest wykonywana, rekordy nie dodają się do bazy ale nie wyświetla się żaden komunikat. Jeśli dodaję :object=>@user_limits to pojawia się błąd, że Array nie ma metody errors.
Ale już znalazłem przyczynę problemów. Otóż error_messages_for(*params) została nadpisana w gettext. Wprawdzie metoda ta obsługuje tablicę obiektów ale nie radzi sobie w sytuacji jeśli @user_limits (w moim przypadku) jest tablicą. objects staje się jednoelementową tablicą zawierającą tablicę obiektów i zonk.
Ponieważ w tej chwili pracuję tylko na lokalnej maszynce to pozwoliłem sobie na modyfikacę gettext:
[code]— lib/gettext/rails.rb.old
+++ lib/gettext/rails.rb
@@ -416,7 +416,11 @@
# “There were %{num} problems with the following fields:”)
def error_messages_for(*params)
options = params.last.is_a?(Hash) ? params.pop.symbolize_keys : {}
-
objects = params.collect {|object_name| instance_variable_get("@#{object_name}") }.compact
-
if object = options.delete(:object)
-
objects = [object].flatten
-
else
-
objects = params.collect {|object_name| instance_variable_get("@#{object_name}") }.compact
-
end object_names = params.dup count = objects.inject(0) {|sum, object| sum + object.errors.count } if count.zero?[/code]
Jak to należy zrobić żeby nie grzebać bezpośrednio w źródłach gettext?
Swoją drogą warto by było to zgłosić do autora ale że ja jestem początkujący … może ktoś bardziej doświadczony wypowie się w tej sprawie.