从 `form_for` 迁移到新的 `form_with`

问题描述 投票:0回答:3

对于以下情况,如何从

form_for
转换为
form_with

<%= form_for(resource, as: resource_name, url: password_path(resource_name), html: { method: :post }) do |f| %>

我浏览了 Rails 的

form_with
文档,但没有找到任何相关示例。

谢谢!

ruby-on-rails devise form-for
3个回答
5
投票

form_with
具有
scope:
选项,可更改输入名称前缀、id 和标签的 for 属性。据我所知,它与
as:
form_for
选项完全相同。

:scope
- 输入字段名称前缀的范围以及如何 提交的参数分组在控制器中。

# Adding a scope prefixes the input field names:
<%= form_with scope: :post, url: posts_path do |form| %>
  <%= form.text_field :title %>
<% end %>
# =>
<form action="/posts" method="post" data-remote="true">
  <input type="text" name="post[title]">
</form>

https://api.rubyonrails.org/v6.0.0/classes/ActionView/Helpers/FormHelper.html#method-i-form_with

所以等效的调用是:

<%= form_with(
      model: resource, 
      scope: resource_name, 
      url: password_path(resource_name), 
      method: :post
    ) do |f| %>

1
投票

尝试

= form_with model: resource, scope: resource_name,
            url: password_path(resource_name), method: :post do |f|

另外

form_with
不会为元素生成类和ID,如果您需要这些 - 手动添加它们

api 中的文档比目前指南中的详细得多。


0
投票
在这种情况下,您不必担心

as: resource_name

html: { method: :post }
。只需使用 
model: resource
 中的 
form_with
 即可开始。

根据

文档

model

 推断 URL 和范围。

所以,用这个

<%= form_with model: Post.new do |form| %> ... <% end %>
相当于:

<%= form_with scope: :post, url: posts_path do |form| %> ... <% end %>

但是由于 Devise 使用不同的辅助方法(在本例中

password_path

)来生成特定的 URL。您只需使用 
url:
 选项以及 
model:
 中的 
form_with
,如下所示:

<%= form_with(model: resource, url: password_path(resource_name)) do |form| %>
将生成类似以下内容:

<form action="/users/password" accept-charset="UTF-8" method="post">
    
© www.soinside.com 2019 - 2024. All rights reserved.