简单来说,你不能有两个独立的嵌套表单。
你可以使用accepts_nested_attributes_for
来嵌套相关表单 - 这取决于后端模型的结构,我会在下面详细说明。
--
表单
你需要知道的最重要的一点是,Rails只创建HTML表单 - 这意味着它们必须遵守所有这些表单规定的约束和规则:
每个表单都有自己的action
属性 - 这是浏览器知道发送数据的位置。如果你有多个/嵌套表单,实际上就会有两个这样的"action"属性;这将防止HTML正确地发送表单。
--
嵌套
如果你想使用一些Rails的约定,最好使用accepts_nested_attributes_for
方法。这个方法位于模型中,为了有效地使用它,你需要确保你的ActiveRecord associations
已正确设置:
Class User < ActiveRecord::Base
has_many :hobbies
accepts_nested_attributes_for :hobbies
end
Class Hobbies < ActiveRecord::Base
belongs_to :user
end
关联的重要性至关重要 - Rails将会相互传递"嵌套"模型数据。只有在使用ActiveRecord正确关联模型时才会存在嵌套模型数据(如上所示)。
然后你可以按以下方式通过你的控制器/模型传递数据:
Class UsersController < ApplicationController
def new
@user = User.new
@user.hobbies.build
end
def create
@user = User.new(user_params)
@user.save
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 %>