2011-06-27 10 views
5

Przez lata napotkałem na różne problemy z różnymi stronami, w których użytkownicy umieszczają spacje na początku i końcu pól tekstowych i tekstowych. Czasami powodują problemy z formatowaniem/układem, czasami powodują problemy z wyszukiwaniem (np. Kolejność wyszukiwania wygląda źle, nawet jeśli tak naprawdę nie jest), czasami faktycznie powodują awarię aplikacji.ActiveRecord: spraw, aby wszystkie pola tekstowe zawierały pasek przed ich zapisaniem, o ile nie podano inaczej.

Pomyślałem, że byłoby to użyteczne, zamiast włożyć kilka wywołań funkcji before_save, tak jak zrobiłem to w przeszłości, aby dodać funkcję ActiveRecord do automatycznego wywoływania .strip na dowolnym polu tekstowym/tekstowym przed zapisaniem, chyba że powiedz, żeby nie, np. z do_not_strip :field_x, :field_y lub czymś podobnym na górze definicji klasy.

Zanim pójdę i wymyślę, jak to zrobić, czy ktoś widział ładniejsze rozwiązanie? Dla jasności, już wiem, że mogę to zrobić:

before_save :strip_text_fields 

def strip_text_fields 
    self.field_x.strip! 
    self.field_y.strip! 
end 

, ale szukam lepszej drogi.

okrzyki, max

Odpowiedz

1

Napisałem plugin w tym celu jakiś czas temu. Nie próbowałem go od jakiegoś czasu i nie ma testów - więc nie ma gwarancji, że nadal działa. Plusem będzie czysty model:

class Story < ActiveRecord::Base 
    strip_strings :title, :abstract, :text 
end 
+0

Bardzo dziękuję @ Wukerplank, włączyłem to i wydaje się, że to robię :) Myślę, że lepiej z punktu widzenia co najmniej-niespodziewanego jawnie wymienić pola tekstowe, które chcę usunąć w modelach, raczej niż wymieniać te, których nie chcę rozbierać tak, jak miałem pierwotnie. Przy okazji link do instalacji na twojej stronie wtyczki nie działa: myślę, że po prostu musisz zamienić "https" na "git" na początku. Jest tam także miejsce do wstawienia, prawdopodobnie do debugowania? Twoje zdrowie! max –

+0

Tak, myślałem także, że jawnie deklarując, że pola będą miały bardziej czytelny model. I dzięki za wskazówki, posprzątam to :) – Wukerplank

+0

gdzie dodałeś narzędzie do ściągania strun? Umieszczam go w lib/modules i nie ładuje się –

10

Oto przydatny moduł, który można upuścić do biblioteki i dołączyć do modeli. Nie ma wyjątków, o których wspomniałeś, ale szuka metody, która może być wystarczająco dobra. W razie potrzeby można łatwo dodać funkcję wyjątków.

# lib/attribute_stripping.rb 
module AttributeStripping 

    def self.included(context) 
    context.send :before_validation, :strip_whitespace_from_attributes 
    end 

    def strip_whitespace_from_attributes 
    attributes.each_value { |v| v.strip! if v.respond_to? :strip! } 
    end 

end 

Zastosowanie tak:

class MyModel < ActiveRecord::Base 
    include AttributeStripping 

    # ... 
end 

UPDATE (10.09.2013):

Revisiting tę odpowiedź za kilka lat później, widzę jak wiatry zmieniły. Teraz jest lepszy sposób na zrobienie tego. Utwórz moduł tak:

module AttributeStripper 

    def self.before_validation(model) 
    model.attributes.each_value { |v| v.strip! if v.respond_to? :strip! } 
    true 
    end 

end 

i ustawić jego metody powoływać się w odpowiednim czasie w modelu:

class MyModel < ActiveRecord::Base 
    before_validation AttributeStripper 

    # ... 
end 

Ten moduł jest łatwiejsze do sprawdzenia, ponieważ to nie jest wstawek.

+0

Aby to zbudować, zobacz http://edgeguides.rubyonrails.org/active_record_validations.html#custom-validators – MCB

+0

Wygląda na to, że nie działa z 'Model # update'. Atrybut zostanie rozebrany, ale w rzeczywistości nie trafi do bazy danych. Nie rozumiem dlaczego. Wywołanie 'Model # save' wydaje się działać dobrze. – Dex

2

Mam do czynienia z tego rodzaju problemami z integralnością danych w różnych aplikacjach.

Kiedyś manipulowałem danymi wejściowymi w ten sposób.

Ale teraz, najlepszą radą, którą rzeczywiście widziałem i śledziłem, jest przechowywanie tego, co użytkownik wpisze. Następnie wykonaj post-processing na zapleczu, aby zrobić pasek. Utwórz dodatkowe pola bazy danych (puste), jeśli naprawdę chcesz je w tabeli modelu bazy danych.

Głównym powodem tego jest jedna (pierwotna) rzecz - kiedy użytkownicy chcą ponownie przejrzeć swoje dane, tj. Edytować, zazwyczaj będą oczekiwać, że zobaczą, co wpisali. Drugim powodem jest to, że unikniesz możliwości że twój pasek nie działa poprawnie i albo zniekształca dane albo faktycznie rzuca błąd.

Powiązane problemy