0

Cách sử dụng form_with vs form_for và form_tag trong rails

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_tagform_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_forfor_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

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí