2012-03-02 42 views
11

tôi đã sử dụng this gem trong ứng dụng của tôi, nhưng tôi không chắc chắn sự khác biệt giữa các tùy chọn thực hiện khác nhau cho đá quý:Sự khác nhau giữa form_for và form_tag?

  • form_for
  • form_tag với khối
  • form_tag mà không cần khối

Có ai có thể làm rõ? Tôi hiểu rằng form_for được sử dụng khi bạn muốn tương tác với một mô hình, nhưng còn hai loại kia thì sao?

+0

có thể trùng lặp của [Khác biệt giữa biểu mẫu \ _cho, biểu mẫu \ _tag?] (Http://stackoverflow.com/questions/1349348/difference-between-form-for- form-tag) –

Trả lời

14

Sự khác biệt là tinh tế nhưng quan trọng. form_for là một công cụ tiên tiến hơn giúp tạo ra một đối tượng bạn sử dụng để tạo ra các yếu tố hình thức của bạn:

<% form_for(@foo) do |form| %> 
    <%= form.text_field(:bar) %> 
<% end %> 

Phương pháp form_tag nhiều nguyên thủy hơn và chỉ phát ra một thẻ. Nếu bạn muốn đặt mọi thứ bên trong <form> thẻ đó là phát ra, bạn đặt mọi thứ bên trong khối:

<% form_tag do %> 
    <%= text_field_tag(:bar, 'bar_value') %> 
<% end %> 

Lưu ý rằng phương pháp form_for xử lý các giá trị lấy từ mô hình của bạn, và ít nhất sẽ cố gắng để định tuyến dạng để hành động thích hợp. Với form_tag bạn chịu trách nhiệm cho mọi thứ vì nó không đưa ra giả định về những gì bạn đang làm.

3

Theo như tôi biết, chỉ có một sự khác biệt đơn giản. form_tag không có khối sẽ chỉ tạo một phần tử html cho bạn. Khi bạn sử dụng biểu mẫu với một khối, nó cũng sẽ tạo thẻ đóng biểu mẫu.

Trong ví dụ:

<% form_tag("/comments") %> 

sẽ dẫn đến

<form action="/comments"> 

đâu

<%= form_tag("/comments") do %> 
    <%= submit_tag %> 
<% end %> 

sẽ tạo

<form action="/comments"> 
    <input type="sumbit" /> 
</form> 
4

Một sử dụng mô hình ràng buộc và khác không

+0

Bạn có thể xây dựng mô hình ràng buộc được không? – mbigras

+0

@mbigras afaik mô hình ràng buộc là khi bạn có một hình thức, (với ví dụ như một người tên trong đó) và nó sẽ tự động được dân cư vào một "người" đối tượng bằng đường ray (hoặc khung khác) về trình. –

+0

như bạn có thể thấy trong ví dụ tadmans form_for là "scoped" đối tượng @ foo (đó là lý do tại sao bạn chỉ cần chỉ định tên thuộc tính, thanh, không giống như trong ví dụ form_tag). Thẻ form_for này cũng hỗ trợ đọc/ghi/cập nhật đối tượng @foo đó trong hộp –

Các vấn đề liên quan