Cách sử dụng form_with vs form_for và form_tag trong rails
Bài đăng này đã không được cập nhật trong 6 năm
Mở Đầu:
Những phiên bản từ Rails 5.1 trở về sau rails cung cấp hai kiểu hỗ trợ biểu mẫu là form_tag
và form_for
.
Bạn sử dụng form_for
với với những model và form_tag
cho các URL tùy chỉnh. Cả hai đều tạo ra HTML cho một form. chúng chỉ có một vài khác biệt nhỏ vì vậy ở phiên bản Rails 5.1 trở đi chúng đa dược kết hợp thành một và đó là form_with
form_with
có thể thực hiện cả 2 chức năng mà hai phương pháp trên có thể làm được. khi bạn vượt qua khuôn khổ của model thì nó đóng vai trò giống như là form_for
.
Ví dụ:
<%= form_with model: Message.new do |form| %>
<%= form.text_field :subject %>
<% end %
chúng ra có một model là Message. sẽ tạo ra HTML kiểu như vầy:
<form action="/messages" method="post" data-remote="true">
<input type="text" name="subject">
</form>
Nếu bạn có một model hiện tại với field sẽ có các giá trị được điền và action đó sẽ chứa ID như nó sẽ đi đến action show trong controller.
# controller
# @message = Message.first
<%= form_with model: @message do |form| %>
<%= form.text_field :subject %>
<% end %>
Hình thức này tương tự như hình ở trên. Bởi vì @message là một đối tượng hiện có, nên generated ra form là khác nhau..
<form action="/messages/1" method="post" data-remote="true">
<input type="hidden" name="_method" value="patch">
<input type="text" name="message[subject]" value="<the subject of the message>">
</form>
nếu bạn không vượt qua khuôn khổ của modek thì hãy sử dụng form_with
nó sẽ hoạt động giống như là form_tag
:
<%= form_with url: messages_path do |form| %>
<%= form.text_field :subject %>
<% end %>
được generate HTML:
<form action="/messages" method="post" data-remote="true">
<input type="text" name="subject">
</form>
Tùy Chọn
Khi sử dụng form_with
khi submit form mặc định (data-remote="true") chúng ta có thể thay đổi điều này bằng cách sử dụng local: true
. điều này là ngược lại so với các phương pháp củ khi ở trong local chúng ta phải set cho nó remote: true.
<%= form_with(model: Message.new, local:true) do |form| %>
<%= form.text_field :subject %>
<% end %>
chúng ta cung có thể chỉ định option có sẳn với form_for
và for_tag
như id, class, html và data
<%= form_with(model: Message.new, data: { behavior: "autosave" }, html: { name: "go" }) do |form|
<%= form.text_field :subject %>
<% end %>
All rights reserved