我认为我有这种结构:
<%= simple_form_for @user ... %>
...
...
<%= render '/hobbies/form', :user => @user %>
...
...
<% end %>
渲染部分从部分加载数据 - 这是一个表单。表单字段已成功加载(如输入,提交输入,单选按钮等),但是当我查看生成的HTML时,在呈现的表单中缺少<%= form_for...
和结束标记。
这意味着当我点击渲染表单中的提交按钮时,不会发送此呈现的表单,而是发送出来的“大” - simple_form_for
。
如何使渲染的表格可发送?
谢谢
答案 0 :(得分:13)
简单地说,您不能拥有两个单独的嵌套表单。
你可以使用accepts_nested_attributes_for
嵌套关联表单 - 这取决于后端模型的结构,我将在下面详述。
-
<强>表单强>
你需要知道的最重要的事情是Rails只是构建HTML forms - 这意味着他们必须遵守所有约束条件。这些表格规定的规则:
每个表单都有自己的action
属性 - 这就是浏览器知道发送数据的位置。如果你有多个/嵌套表单,你基本上会有两个这样的“动作”属性;阻止HTML正确发送表单
-
<强>嵌套强>
如果你想使用一些Rails约定,你最好使用accepts_nested_attributes_for
方法。这位于模型中,为了有效地使用它,您需要确保正确设置ActiveRecord associations
:
#app/models/user.rb
Class User < ActiveRecord::Base
has_many :hobbies
accepts_nested_attributes_for :hobbies
end
#app/models/hobby.rb
Class Hobbies < ActiveRecord::Base
belongs_to :user
end
关联的重要性至关重要--Rails会将“嵌套”模型数据传递给对方。只有模型与ActiveRecord(如上所述)
正确关联时,嵌套模型数据才会出现然后您可以通过控制器/模型传递数据,如下所示:
#app/controllers/users_controller.rb
Class UsersController < ApplicationController
def new
@user = User.new
@user.hobbies.build # -> essential for nested attributes
end
def create
@user = User.new(user_params)
@user.save #-> notice how this saves the @user model only?
end
private
def user_params
params.require(:user).permit(:user, :attributes, hobbies_attributes: [:hobbies, :attributes])
end
end
这将允许您包含表单的hobbies
部分,如下所示:
<%= form_for @user do |f| %>
<%= f.fields_for :hobbies do |h| %>
<%= h.text_field :your_attributes %>
<% end %>
<% end %>
答案 1 :(得分:6)
嵌套表单无效html。要实现此目的,您必须取消嵌套表单或使用javascript。如果您选择使用javascript方法,则只需捕获表单提交事件,阻止默认值,然后手动提交所需的表单。
编辑:
如果您选择使用javascript方法,请考虑您可能根本不需要两个表单。相反,您只需在“子操作”按钮上添加按钮的点击处理程序即可。这是一个ajax请求。
或者,如果javascript不是一个选项,并且重新排列html不是一个选项,您可以通过提交两个表单中的数据并根据单击的提交输入进行不同的处理来在服务器上处理此问题。
答案 2 :(得分:2)
您不能在表单中包含表单。如果您的关联正确设置了类似
的内容class User < ActiveRecord::Base
has_many :hobbies
accepts_nested_attributes_for :hobbies
end
class Hobby < ActiveRecord::Base
belongs_to :user
end
然后您可以在表单中使用fields_for
,例如
<%= form_for @user do |u| %>
// user fields
<%= u.fields_for :hobbies do |h| %>
// hobbies fields
<% end %>
<%= f.submit %>
<% end %>
这会给你像
这样的参数users_attributes: { name: "xyz", hobbies_attributes: { attribute: "value"} }