Skoro apohllo rozpoczął offtopa.
Jest późno, ale spróbuję przeprowadzić mały dowód, który pomoże wychwycić błędy.
Na warsztat biorę przykład-sposób użycia:
[code=ruby]- user = r(user)
- user.form do
login:
= user.login
= user.email.label
= user.email.text_field[/code]
- Założenia:
- widok jest “głupi” (lub pasywny, jak kto woli), dostaje wszystkie zmienne z kontrolera i sam z siebie nie powinien tworzyć zmiennych lokalnych
- model nie powinien tworzyć widoku
Przynajmniej jeśli chodzi o tworzenie formularzy (pomijam rozbudowane raporty) można się z tymi zaożeniami zgodzić
Na początku linie:
[code=ruby]- user = r(user)
- user.form do[/code]
Zgodnie z założeniem pierwszym należy unikać tworzenia zmiennych lokalnych (a tak się własnie dzieje).
Można próbowac tworzyć moduł i rozszerzać nim model, ale jest to niezgodne z drugim założeniem, więc potraktuję to zdanie jako żart.
Drugim wyjściem jest zastosowanie bloku:
- r(user) do |user|
= user.login
= user.email
A na poważnie, domyslam się, co chcesz utworzyć. Jak rozmawialiśmy w biurze zasugerowałem użycie własnego form buildera i wciąż sądzę, że własny, dopieszczony form builder mógłby rozwiązać sprawę.
Twoją ideę chyba łapię, chcesz użyć refleksji na modelu, by generowac formularze; bardziej rozbudowany przykład mógłby wyglądać tak (już z uzyciem bloku):
[code=ruby]- bragi_form_for @invoice, :vertical do |invoice|
= invoice.seller
= invoice.customer
= invoice.date
- invoice.lines(:horizontal) do |line|
= line.product :combo
= line.quantity
= line.product.price :editable => false
= invoice.total :editable => false[/code]
To taki podgląd na szybko. Uważam jednak, że narazić się tu można na pewną nieelastyczność. Czasem w widoku w różny sposób chcemy reprezentować dane pole z modelu.
Weźmy przypadek pola “sprzedawca”. Czasem chcemy reprezentować sprzedawcę pełną nazwą, a czasem tylko skrótem, albo pełnym adresem (w widoku - na przykład w polu kombo). Łatwiej powiedzieć chyba, że
wstawiamy do
formularza.pole_kombo ze_zrodlem_danych (tu chyba można nawet lambdę wstawić (?))
formularza.pole_tekstowe email
Jeśli chodiz o etykiety, można je pobierać z tłumaczeń i18n. Zrobiłem nawet swój prosty form builder oparty na, niestety tabelkach (obiecuję poprawić), ucząc się z przykładu na pragmatic.tv: http://pastie.org/646149
i przykładowe użycie:
- tabled_form_for user do |f|
= f.text_field :user
= f.password_field :password
= f.submit
Faktycznie jest ty pewne ograniczneie co do obsługi relacji has_many (w form builderach) - przynajmniej jeszcze do tego nie dotarłem, ale rozwiązanie wydaje mi się logiczne
(Rano obiecuję przeczytać jeszcze raz to, co napisałem )
EDIT: tak, nadużywałem słowa “tworzyć” ale programownaie to taka twórcza praca