在一个Rails表单中编辑单个类的许多对象的最佳方法是什么?

时间:2011-12-05 16:41:22

标签: ruby-on-rails ruby-on-rails-3 forms haml

我正在开发一个Rails表单,允许用户使用单个提交编辑类的许多对象的属性。我最初的直觉是创建一个外部form_for块,然后使用fields_for遍历其中的项目。

但是,没有任何对象与表单将修改的对象具有一对多的关系,因此在我看来,没有任何对象可以传递到form_for

在任何情况下,我想看到的是一个表单的示例,该表单同时修改多个对象而不吸引“父”对象。也许这会涉及form_tag

(注意:我正在使用haml,所以haml中的答案虽然不必要,但会很棒。)

2 个答案:

答案 0 :(得分:4)

好吧,拥有一个父对象会让它变得更容易。

对于许多对象的批量更新,关键是使用正确的输入名称,以便rails将params解析为数组,即

@posts.each do |post|
  fields_for "posts[#{post.id}]", post do |p|
    p.text_field :name
    p.hidden_field :id
  end
end

查看生成的html源代码,了解文本输入获取的名称属性。如果这样做是正确的,params [:posts]现在将成为控制器中的哈希值,然后您可以更新。

http://railscasts.com/episodes/165-edit-multiple也应该相关

答案 1 :(得分:0)

我的实际情况还有一些额外的皱纹,但这里有一些伪代码,我希望能说明我采取的方法:

 = form_tag url_for(:controller => "the_controller",
                     :action => "update") do
     @objects_to_be_updated.each do |object|
       = check_box_tag "[desired_path][through_the][parameters_hash]", true, object.boolean_attibute
       = text_field_tag "[another_path][through_the][parameters_hash]", object.text_attribute
     end
 end

等等。

使用表单助手的_tag变体(不需要与Active Record模型关联)有点痛苦,但似乎也可以让您更好地控制结果参数的结构。< / p>