Sự khác biệt giữa form_for, form_tag?


80

Sự khác biệt giữa form_for và form_tag là gì? Có gì khác nhau cho form_remote_for và form_remote_tag không?

Câu trả lời:


63

Bạn sẽ sử dụng form_for cho một mô hình cụ thể,

<% form_for @person do |f| %> # you can use f here

    First name: <%= f.text_field :first_name %>
    Last name : <%= f.text_field :last_name %>

<% end %>

Form_tag tạo biểu mẫu cơ bản,

<%= form_tag '/person' do -%>
  <%= text_field_tag "person", "first_name" %>
<% end -%>

53

form_fornhư lập luận đầu tiên của nó, thích một đối tượng ghi âm hoạt động; nó cho phép dễ dàng tạo hoặc chỉnh sửa biểu mẫu (để sử dụng nó trong chế độ xem "mới", bạn nên tạo một phiên bản trống trong bộ điều khiển, như:

def new
  @foo = Foo.new
end

Nó cũng chuyển một biến biểu mẫu cho khối, để bạn không phải lặp lại tên mô hình trong chính biểu mẫu. đó là cách ưa thích để viết một biểu mẫu liên quan đến mô hình.

form_tagchỉ cần tạo một thẻ biểu mẫu (và tất nhiên là âm thầm chuẩn bị một trường ẩn chống giả mạo, như form_for); nó tốt nhất được sử dụng cho các biểu mẫu không phải mô hình (tôi thực sự chỉ sử dụng nó cho các biểu mẫu tìm kiếm đơn giản hoặc tương tự).

Tương tự, form_remote_forform_remote_tagphù hợp với các biểu mẫu liên quan đến mô hình chứ không phải các biểu mẫu liên quan đến mô hình tương ứng, nhưng thay vì kết thúc bằng phương thức http chuẩn (GET, POST ...), chúng gọi phương thức ajax.

Tất cả điều này và hơn thế nữa đều có sẵn để bạn thưởng thức trong FormHelper PrototypeHelper các trang tham khảo.

CHỈNH SỬA 2012-07-13

Prototypeđã bị xóa từ railslâu và các hình thức từ xa đã hoàn toàn thay đổi. Vui lòng tham khảo liên kết đầu tiên, với reguard cho :remotetùy chọn của cả hai form_forform_tag.


1
@WowBow bạn nói đúng; xét cho cùng, câu trả lời này khá cũ, và Nguyên mẫu đã bị xóa khỏi đường ray từ lâu. Tôi sẽ chỉnh sửa câu trả lời của mình.
giorgian

Điều đó có nghĩa là gì khi form_for"thích" một đối tượng ActiveRecord?
shiggity

1
@shiggity: nó cũng chấp nhận một biểu tượng hoặc chuỗi, tất nhiên. Nhưng với một đối tượng ActiveRecord, nó hoạt động đúng.
giorgian

4

Chúng phải tương tự:

<% form_for @person do |f| %>
  <%= f.text_field :name %>
<% end %>

và:

<%= form_tag '/person' do %>
  <%= text_field_tag "person[name]" %>
<% end %>

Nếu bạn muốn gửi cùng một tham số cho bộ điều khiển, bạn sẽ phải xác định điều này một cách rõ ràng.


Ngắn gọn và chính xác. [
Hết hạn
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.