为一组对象重新填充Rails表单

时间:2014-06-27 20:54:25

标签: ruby-on-rails forms form-for

我想使用一个表单创建多个用户对象。我的表格看起来像这样:

= 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,但似乎无法正确使用语法。

1 个答案:

答案 0 :(得分:0)

我通过重新分解我的表单以表示单个对象模型来解决这个问题,该模型接受用户的嵌套属性(如我在问题[here]中发布的链接中所建议的那样)。我最终在我的数据库中添加了一个额外的模型(以及控制器/视图的额外文件),但控制器代码更清晰,我能够更多地使用rails魔法。