zmienna = warunek ? wartosc_jak_prawda : wartosc_jak_falsz;na przykład:
String message = object.getMessage().equals("") ? "brak wiadomości" : object.getMessage();
zmienna = warunek ? wartosc_jak_prawda : wartosc_jak_falsz;na przykład:
String message = object.getMessage().equals("") ? "brak wiadomości" : object.getMessage();
double kilobytes = 123.45678; DecimalFormat df = new DecimalFormat("###.##"); System.out.println("kilobytes (DecimalFormat) : " + df.format(kilobytes));Tylko żebyś się nie zdziwił, że w liczbie jest przecinek zamiast oczekiwanej kropki jak podałem w formacie "###.##". Otóż Java nie interpretuje tego dosłownie. Kropka jest tutaj znakiem odstępu dziesiętnego. W przypadku lokalizacji polskiej naszym naturalnym znakiem jest przecinek i stąd ta różnica.
df.format(kilobytes).replace(",", ".");Aby zaś zastosować to na stałe użyj lokalizacji, dla której właściwym znakiem jest kropka. Na przykład amerykańskiej.
System.out.println(String.format(Locale.US, "%f", 3.141592));a można na stałe:
Locale.setDefault(Locale.US);
liczba | wymagany format |
---|---|
1 | 01.000 |
2,03 | 02.030 |
2,45 | 02.450 |
14,035 | 14.035 |
Float x = 2.35f; DecimalFormat df = new DecimalFormat("00.000"); System.out.println(df.format(x).replace(",", "."));na wyjściu otrzymałem:
02.350
Kolekcja | Opis |
---|---|
ArrayList |
Sekwencja indeksowana o zmiennych rozmiarach |
LinkedList |
Sekwencja uporządkowana umożliwiająca efektywne wstawianie i usuwanie dowolnej pozycji |
HashSet |
Kolekcja nieuporządkowana, która nie dopuszcza duplikatów. |
TreeSet |
Zbiór uporządkowany. Nie dopuszcza duplikatów |
EnumSet |
Zbiór wartości typu wyliczeniowego. Nie dopuszcza duplikatów |
LinkedHashSet |
Zbiór zapamiętujący kolejność wstawiania elementów. Nie dopuszcza duplikatów. |
PriorityQueue |
Kolekcja pozwalająca na efektywne usuwanie najmniejszego elementu. |
HashMap |
Struktura danych przechowująca asocjacje klucz -> wartość . |
TreeMap |
Mapa o kluczach uporządkowanych. |
EnumMap |
Mapa, której klucze należą do typu wyliczeniowego.
private enum BmiComponentNames {MASS, TALL}
EnumMap<BmiComponentNames, Float> bmiComponents = new EnumMap<BmiComponentNames, Float>BmiComponentNames.class); bmiComponents.put(BmiComponentNames.MASS, 79f); bmiComponents.put(BmiComponentNames.TALL, 185f); |
LinkedHashMap |
Mapa zapamiętująca porządek, w którym umieszczane były asocjacje. |
WeakHashMap |
Mapa, której wartości mogą być odzyskiwane przez mechanizm odzyskiwania nieużytków, gdy nie są używane nigdzie indziej. |
IdentityHashMap |
Mapa o kluczach porównywanych za pomocą operatora == a nie metody equals() |
List | Set |
---|---|
Dopuszcza duplikaty. | Nie dopuszcza duplikatów. |
Kolekcja uporządkowana. | Kolekcja nieuporządkowana. |
Używa metody equals() do porównywania elementów podczas wstawiania. |
|
Najpopularniejsze implementacje: ArrayList,
Vector,
LinkedList
Ciekawe omówienie różnic pomiędzy ArrayList , a LinkedList .
|
Najpopularniejsze implementacje: HashSet,
TreeSet,
LinkedHashSet |
Tworzę sobie model. Roboczo nazwijmy go UserMailer. Dziedziczy on po ActionMailer::Base. W modelu tym ustawiam metody, z których każda jest wzorem wysyłanego emaila.
Na przykład dla newslettera tworzę:def newsletter(newsletter, email) recipients email from "#{Options::Program_name} - newsletter :: <#{Options::Email}>" subject newsletter.subject sent_on Time.now body({ :body => newsletter.body }) endPrzekazane parametry to:
newsletter
- obiekt zawierający dane dla newslettera takie jak choćby temat;email
emaile (emaile) do wysyłkinewsletter
, a nazywająca się :body
wystąpi w widoku.
Jeśli już mam metodę, to przygotowuję dla niej widok. Dla takiej konfiguracji, jaką opisuję widoki winny być umieszczone w folderze /views/user_mailer
czyli w nazwie zgodnej z nazwą modelu.
Widok powinien być standardowym plikiem html.erb
z dopiskiem .text. W naszym przypadku dla metody newsletter
widok powinien się zwać nomen omen newsletter.text.html.erb
albo newsletter.text.erb
. W widokach należy unikać stosowania zewnętrznych styli i w ogóle ograniczyć zabawę ze stylami, gdyż w klientach mailowych źle się to wyświetla. Należy raczej pozostać przy dawnym formatowaniu przy pomocy tabel.
Tu jest jakiś nagłówek ...................................
|
<%= @body %> |
A tu jest jakaś stopka ...................................
|
@body
, którą definiowaliśmy w metodzie jako :body
.UserMailer.deliver_newsletter(newsletter_data, "jan.testowy@test.pl")W metodzie
deliver_newsletter()
po podkreślniku występuje nazwa metody, którą klasa UserMailer
ma wywołać. Obiekt newsletter_data
zawiera w swych polach dane do wysyłki newslettera. Na przykład newsletter_data.subject
zawiera temat newslettera.
netsh advfirewall set global StatefulFTP disableteraz powinno zadziałać.
customer=Customer.find(params[:id]) customer.orders.each do |order| # ... tu jakieś operacje z użyciem order .... end
customer=Customer.find(params[:id]) customer.send("orders").each do |order| # ... tu jakieś operacje z użyciem order .... end