我想使用一个表单创建多个用户对象。我的表格看起来像这样:
= form_for @users, :url => "batch_add" do |f|
- @users.each_with_index do |user, index|
= fields_for "I-DONT-KNOW WHAT-GOES-HERE" do |u|
= render :partial => "user_fields", :locals => {:i => index}
我的Users控制器中有两种方法,如下所示。第一个方法(batch_add_new)在首次加载表单(GET)时调用,第二个方法(batch_add_create)在表单提交(POST)时调用。
def batch_add_new
@users = [User.new]
end
def batch_add_create
@users = []
i = 0
while(!params["user_" + i.to_s].nil?)
u = User.new(params["user_" + i.to_s])
@users << u
i = i + 1
end
end
if @users.all?(&:valid?)
@users.all?(&:save)
flash[:notice] = "Users have been sucessfully created!"
redirect_to "/some/path"
else
render :batch_add_new
end
当我提交表单时,我会得到这样的参数(如果我试图添加两个用户):
{...,"user_0"=>{"role_id"=>"1","name"=>"X"},
"user_1"={"role_id"=>"2","name"=>"Y"}, ...}
我应该将哪些内容传递到fields_for,以便此表单正常运行,并且字段会在验证失败时重新填充?我尝试按Multiple objects in a Rails form中的建议传递users[], user
,但似乎无法正确使用语法。
答案 0 :(得分:0)
我通过重新分解我的表单以表示单个对象模型来解决这个问题,该模型接受用户的嵌套属性(如我在问题[here]中发布的链接中所建议的那样)。我最终在我的数据库中添加了一个额外的模型(以及控制器/视图的额外文件),但控制器代码更清晰,我能够更多地使用rails魔法。