编辑未针对非持久数据显示的表单输入

edit form inputs not appearing for non-persisted data

我有一个不是设计表单的编辑表单(我在不同的视图上有一个设计编辑)来编辑用户详细信息。但是,只有当数据已经存在时,表单输入才会出现。因此用户无法向表单添加新的详细信息,因为输入根本没有出现。

发生这种情况是因为我没有使用设计表单视图吗?

这是我自己编辑文件中的代码:

<%= render "devise/registrations/details", f: f, resource: @resource, addressable: @resource, default_location: nil %>

然后在 devise/registration/details 我有这个:

<%= f.simple_fields_for :address do |fields| %>
    <%= render "address/fields", fields: fields, addressable: addressable, resource: resource %>
    <% end %>

但是,我认为输入没有显示,因为 fields 在迭代中是空白的。然而,这些字段显示在实际的 devise/edit 文件中,即使它们是空白的,只是不在我的新文件中。

当使用 fields_forsimple_fields_for(基本上只是前者的改进版本)时,您必须 "seed" 输入才能显示。

考虑这个简化的普通 rails 示例:

class UsersController < ApplicationController
  def new
     @user = User.new
     @user.build_address
  end
  # ...
end

<%= simple_form_for(@user) do |f| %>
  <%= f.simple_fields_for(:address) do |af| %>
     <%= af.input :street %>
  <% end %>
<% end %>

如果我们删除行 @user.build_address,将不会有嵌套输入。那是因为 simple_fields_for@user 上调用方法 #address 并为记录创建输入。如果关联是一对多或多对多,它将遍历该关联。如果方法 returns nil 或为空,则没有要创建的输入 - 这就像用 nil 调用 form_for

您还可以将第二个参数传递给fields_for以手动指定记录对象:

<%= simple_form_for(@user) do |f| %>
  <%= f.simple_fields_for(:address, @user.address || @user.build_address) do |af| %>
     <%= af.input :street %>
  <% end %>
<% end %>

在 Devise 中,您可以通过将块传递给 super 或覆盖 #build_resource.

来完成此操作
class MyRegistationsController < Devise::RegistrationsController
  def new
    super { |resource| resource.build_address }
  end
end