FormTagHelper vs czysty HTML

Witam, zastanawiam się nad sensem stosowania tzw. FormTagHelper
mam powiedzmy taki sobie formularz:

[quote]<%= form_for :post do |eee| %>


<%= eee.label :fname, ‘Imię’ %>
<%= eee.text_field :fname, class:‘klasa’, placeholder:‘Wpisz swoje imię’ %>


<%= eee.label :lname, ‘Nazwisko’ %>
<%= eee.text_field :lname,class:‘klasa’ %>


<%= eee.label :email, ‘E-mail’ %>
<%= eee.email_field :email, :class => ‘klasa’,placeholder:‘email@domena.pl’ %>


<%= eee.submit ‘Wyślij’ %>

<% end %>[/quote]
I chciałbym się dowiedzieć czy nie szybsze byłoby (pod względem wydajnościowym) zastosowanie czystego HTML?
Albo inaczej, czy ułatwia Wam to pracę nad projektami w Rails? Korzystacie z tego na co dzień? Czy jest to istotny problem? (pewnie nie :/)

I jeszcze jedno, czy w tym formularzu da się w jednej linijce ustalić klasy dla wszystkich pól? Tak, żeby się nie powtarzać, bo ROR podobno kładzie nacisk na zasadę “DRY” :slight_smile:

Wiele osób używa gema Simple Form (https://github.com/plataformatec/simple_form), który jeszcze bardziej ułatwia sprawę.

  1. Używając czystego htmla hardcodujesz urla w formularzu, co jest słabe, bo przy ewentualnych zmianach w routingu musisz o tym pamiętać i ciężko jest wychwycić taki błąd. Ale bardziej istotna jest kwestia bezpieczeństwa, musiałbyś ręcznie dodawać tokena do formularza zabezpieczając się przed CSRF: http://guides.rubyonrails.org/security.html#cross-site-request-forgery-csrf
  2. Polecam zapoznać się z gemem SimpleForm: https://github.com/plataformatec/simple_form/

Tak samo jak i inne:

<%= f.text_field :field_name, :autocomplete => 'off' %>

Nie powiedziałbym aby to akurat było problemem, zazwyczaj i tak samemu trzeba podawać url ( w sensie http://guides.rubyonrails.org/routing.html#path-and-url-helpers ) :wink:

CRSF, kodowanie i rodzaj metody jest dodawany z automatu. Oprócz tego masz odpowiednią przestrzeń nazw dla parametrów ( którą też można zmienić poprzez opcję as ), którą możesz dodatkowo zagnieżdżać poprzez fields_for.

Co do ustawienia domyślnych ustawień dla wszystkich formularzy, to tak jak już było wspomniane gem simple_form ładnie upraszcza sprawę, można definiować całe bloki takie jak ten

[code=ruby]


<%= eee.label :fname, ‘Imię’ %>
<%= eee.text_field :fname, class:‘klasa’, placeholder:‘Wpisz swoje imię’ %>
[/code] zamieniasz w
<%= eee.input :fname %>

efekt końcowy jest ten sam przy mniejszej ilości powtarzającego się kodu, plus dodatkowo masz błędy obok pola, i schemat do tłumaczeń takich jak podpowiedzi, placeholder, label oraz wiele innych ( zapraszam do dokumentacji ), np. coś ala twitter bootstrap:

[code=ruby]# config/initializers/simple_form.rb - ustawienia domyślne i wrappery
config.wrappers :bootstrap, :tag => ‘div’, :class => ‘control-group’, :error_class => ‘error’ do |b|
b.use :html5
b.use :placeholder
b.use :label
b.wrapper :tag => ‘div’, :class => ‘controls’ do |ba|
ba.use :input
ba.use :error, :wrap_with => { :tag => ‘span’, :class => ‘help-inline’ }
ba.use :hint, :wrap_with => { :tag => ‘p’, :class => ‘help-block’ }
end
end

w widoku masz

<%= form.input :field_name %>

co jest odpowiednikiem

<%= form.label :field_name, t('simple_form.labels.model_name.field_name') %>
<%= form.text_field :field_name, placeholder: t('simple_form.placeholders.model_name.field_name') %> <%- if form.error(:field_name).present? %> <%= form.error(:field_name) %> <% end -%> <%- if t('simple_form.hints.model_name.field_name').present? %>

<%= t('simple_form.hints.model_name.field_name') %>

<% end -%>
[/code] tak więc z simple_form naprawdę robi się DRY ;)

Nie powiedziałbym aby to akurat było problemem, zazwyczaj i tak samemu trzeba podawać url ( w sensie http://guides.rubyonrails.org/routing.html#path-and-url-helpers ) ;)[/quote]
Miałem na myśli to, że jeśli używasz url helperów, to przy zmianie routingu strona się nie wyrenderuje i sypnie błędem (łatwe do wychwycenia w testach). Choć swoją drogą nic nie stoi na przeszkodzie, aby używać url helperów także jeśli pisze się z palca cały formularz w htmlu.

Tak tylko na marginesie - Jeżeli często zdarza Ci się podawać “ręcznie” atrybut url w formularzu dla form_for (simple_form_for), to prawdopodobnie robisz coś niezgodnie z konwencją.

Do tego jeszcze automatyczne nazywanie i klasowanie pól oraz współpraca z modelem pod kątem walidacji.