Form_tag và sự khác biệt so với form_for
Trong Rails có hai phương thức để tạo thẻ <form></form> đó là: form_for và form_tag . Ta có thể tìm thấy rất nhiều ví dụ về form_for bởi chúng ta thường xuyên sử dụng nó để tương tác trực tiếp với models mà chúng ta đã tạo trong database. Tuy nhiên trong khá nhiều trường hợp ...
Trong Rails có hai phương thức để tạo thẻ <form></form> đó là: form_for và form_tag. Ta có thể tìm thấy rất nhiều ví dụ về form_for bởi chúng ta thường xuyên sử dụng nó để tương tác trực tiếp với models mà chúng ta đã tạo trong database. Tuy nhiên trong khá nhiều trường hợp chúng ta cần tạo một form mà không cần tương tác với database, nó không nhất thiết phải kết nối trực tiếp với bất kỳ model nào, form_tag giúp chúng ta làm được điều này. Về cơ bản, giữa form_for và form_tag có hai điểm khác biệt chính: Đầu tiên, đó chính là cách khai báo. Với form_for: <% form_for @user do |f| %> hoặc: <%= form_for :user do |f| %> Sau đó, chúng ta có thể sử dụng biến f để gọi các trường mà chúng ta cần:
<%= f.text_field :first_name %><br /> <%= f.password_field :first_name %><br /> <%= f.check_box :paid %> <%= f.submit "login" %>
Với form_tag ta khai báo như sau: <%= form_tag path, method: :get do %> # voi path = '/users' hoặc <%= form_tag '/users', :method=>'get' do %> # => <form action="/posts" method="get"> Trong form_for, tham số đầu tiên chính là một biến instance sinh ra từ trong controller hoặc có thể là một record. Còn trong form_tag, tham số đầu tiên chính là một path, nếu không set gía trị, method sẽ được chọn mặc định là 'post'. và sau đó tạo các trường với text_field_tag, select_tag, submit_tag... thay vì f.text_field, f.select, f.submit... như trong form_for. Đây chính là điểm khác biệt thứ hai trong cách sử dụng form_tag:
<%= text_field_tag "subject" %> <%= select_tag("priority", options_for_select([['Critical', '1'], ['Important', '2'],['Standard','3']], '3')) %> <%= text_area_tag "description", "", :size=>"50x20" %> <%= file_field_tag "attachment" %> <%= submit_tag 'Submit' %>
Trên đây là những khác biệt chính giữa form_for và form_tag. Thật đơn giản phải không nào!