编辑未针对非持久数据显示的表单输入
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_for
和 simple_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
我有一个不是设计表单的编辑表单(我在不同的视图上有一个设计编辑)来编辑用户详细信息。但是,只有当数据已经存在时,表单输入才会出现。因此用户无法向表单添加新的详细信息,因为输入根本没有出现。
发生这种情况是因为我没有使用设计表单视图吗?
这是我自己编辑文件中的代码:
<%= 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_for
和 simple_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