AR: domyślna zwracana wartość

Witam,
stworzyłem szablon dokumentu do wydruku, stosowne pola są zapełniane wartościami z bazy, ale często występuje sytuacja, że w bazie nie ma kompletu danych. W takim przypadku w szablonie powinny pojawić się kropki ("…"*10), żeby po wydruku była możliwość ręcznego uzupełnienia dokumentu.
taki kod:

puts "Imię:  #{p.name}  Nazwisko: #{p.surname}  "

tworzy:

Imię:  Nazwisko:

a powinien:

Imię: .............................. Nazwisko: ..............................

Nie chcę tych kropek umieszczać w bazie danych.
Odpowiada mi rozwiązanie pokazane na tej stronie: http://www.jroller.com/obie/entry/default_values_for_activerecord_attributes
tj.

class Specification < ActiveRecord::Base def tolerance read_attribute(:tolerance) or 'n/a' end end
W moim przypadku powyższy kod musiałbym powtórzyć dla każdego pola. Jak tego uniknąć?
Z góry dzięki za pomoc

Pewnie coś w stylu brutalnego metaprogramowania

[:failure, :error, :success].each do |method| define_method method do read_attribute(method) || '...' end end
Ewentualnie samo define_method możesz sobie zamknąć w eleganckie makro (default_dotted_attribute :failure)

Jeżeli ustawisz domyślne wartości w migracjach też będziesz je miał w nowych obiektach. To jest chyba najlepsze rozwiązanie.

Alternatywnie od 3.0 zdaje się.

class Specification < ActiveRecord::Base scope :with_default_values, where(:tolerance => 'n/a', :foo => 'n/a', :bar => 'n/a') end
po czym albo:

default_scope :with_default_values

które niestety ma troszkę (czytaj sporo) wad albo przy każdym tworzeniu obiektu :

@spec = Specification.with_default_values.new

dzięki, działa brutalnie dobrze.

nie chcę zapisywać kropek w bazie, więc odpada. Stosowanie if/unless w widoku też wydaje się mało eleganckie.

Czytelność kodu jest bardzo ważna ale nie można popadać z jednej skrajności w drugą. Czemu nie chcesz ustawić wartości domyślnej na polu w bazie w migracji, skoro to najlepsze (imo) i najprostsze rozwiązanie? Użytkownicy i tak wrzucają takie cuda w formularze, że gwarantuję Ci iż porządku tam długo nie utrzymasz.

Możesz popatrzeć jeszcze na prezentery:


Moim zdaniem te kropki to nie mają nic wspólnego z modelem więc totalnie bym odrzucił pomysł wkładania tam jakiejkolwiek logiki z tym związanej. Zrób sobie helpera może, który użyje sprintf by dopełnić kropkami do N znaków. Logika widoku => helper (ewentualnie właśnie presenter).

Czytelność kodu jest bardzo ważna ale nie można popadać z jednej skrajności w drugą. Czemu nie chcesz ustawić wartości domyślnej na polu w bazie w migracji, skoro to najlepsze (imo) i najprostsze rozwiązanie? Użytkownicy i tak wrzucają takie cuda w formularze, że gwarantuję Ci iż porządku tam długo nie utrzymasz.

Możesz popatrzeć jeszcze na prezentery:
http://railscasts.com/episodes/287-presenters-from-scratch?view=asciicast
https://www.ruby-toolbox.com/categories/rails_presenters[/quote]
A co jak ktoś faktycznie kropki wpisze? Jak rozpoznasz czy to kropki wprowadzone przez usera czy domyślne ? :stuck_out_tongue:

+1 dla prezenterów !!!111jeden

wstyd będzie pokazać komuś kropki w bazie, szczególnie że one mają tylko reprezentować null a nie go zastępować.
Realizacja tego na poziomie modelu (mój pierwszy pomysł) rzeczywiście mija się z celem, bo to nic wspólnego z modelem nie ma, a może zaszkodzić w przyszłości.
Optymalnym wydaje się widok / meta-helper, ciekawe czy mi coś z tego wyjdzie.

To na koniec żenujący dowcip pytającego (w stylu umiarkowanie-szowinistycznym):

Niewidomy mężczyzna wchodzi przez pomyłkę do baru dla lesbijek, odnajduje drogę do baru i zamawia drinka. Po chwili zagaduje barmankę:

  • Hej, opowiedzieć ci kawał o blondynce?
    W barze zapada cisza. Kobieta siedząca obok niego mówi:
  • Zanim opowiesz ten kawał, powinieneś coś wiedzieć. Barmanka jest blondynką, ochroniarz jest blondynką i ja też jestem blondynką z czarnym pasem karate. Poza tym kobieta, która siedzi obok mnie, jest kulturystką, a dziewczyna po twojej prawej stronie zapaśniczką. Nadal chcesz opowiedzieć ten dowcip?
    Niewidomy zastanawia się chwilę i odpowiada:
  • Nieee, skoro musiałbym go powtarzać aż pięć razy.

Trzymanie kropek w bazie danych to chory pomysł. Ja zrobiłbym to za pomocą helpera.

module ApplicationHelper def d(value) value.blank? ? "."*30 : value end end

Przepraszam, za szybko przeskanowałem pierwszy post, i dałem odpowiedź na zadane pytanie. Myślałem że chodzi o jedna konkretną wartość (np. “N/A”), która miała reprezentowac brak danych.

To co ty chcesz zrobić, poprawnie należy zrobić przez użycie atrybutu placeholder w tagu input. Nie trzeba generować żadnych dodatkowych cudów, po prostu dodajemy:

 :placeholder => "." * 20

Po czym dodanie JS’a z polyfill dla przeglądarek jeszcze go nieobsługujących. np.: https://github.com/danbentley/placeholder lub https://github.com/jackfranklin/HTML5-Placeholder-PolyFill

PS. A drążąc jeszcze głębiej problem. Jeżeli chodzi tylko o umieszczenie kropek na wydruku, to czemu nie coś takiego:

input{ border: none; border-bottom: 3px dotted black; }

Dostaniesz dokładnie to co oczekujesz w druku, jednocześnie nie tykając ani helperów, ani nie modyfikując formularzy, ani nie niszcząc UI dla klientów z neta?

@Świstak
nie próbuję zrobić formularza, to w ogóle nie ma być HTML, tylko zwykły tekst.

@knife
Twój kod działa dokładnie tak jak oczekiwałem. dzięki.

@rui mea culpa, z boku wyglądało to jak klasyczny formularz dokumentu.

A sry, nie przeczytalem pierwszego posta, zle wyczailem o co chodzi i chcialem Ci niepotrzebnie namieszac, a wystarczy oczywiscie helper.