ruby-on-rails 从`form_for`迁移到新的`form_with`

iszxjhcz  于 2023-10-21  发布在  Ruby
关注(0)|答案(3)|浏览(121)

如何将form_for转换为form_with

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

我看过Rails的form_with文档,但没有找到任何相关的例子。
谢谢你,谢谢

xfyts7mz

xfyts7mz1#

form_with具有scope:选项,用于更改输入名称前缀、id和标签的for属性。据我所知,它与form_foras:选项完全相同。
: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| %>
csbfibhn

csbfibhn2#

尝试

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

form_with也不会为元素生成类和id,如果你需要的话-手动添加它们
目前API中的文档比指南中的要详细得多。

ux6nzvsh

ux6nzvsh3#

在这种情况下,您不必担心as: resource_namehtml: { method: :post }。只需在form_with中使用model: resource,就可以了。
根据文件:
model同时推断URL和作用域。
所以,用这个

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

相当于这样的东西:

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

但是由于Devise使用了不同的帮助器方法,在本例中为password_path,以生成特定的URL。您只需要在form_with中使用url:选项沿着model:,如下所示:

<%= form_with(model: resource, url: password_path(resource_name)) do |form| %>

将生成类似于:

<form action="/users/password" accept-charset="UTF-8" method="post">

相关问题