如何在一个Ruby on Rails表单中编辑多个记录?

9
我正在制作一个简单的待办事项应用程序,以学习 Ruby on Rails,但是我遇到了一个问题。我有一个简单的表单,列出了待办事项,并在左侧放置了复选框,在底部放置了一个“更新”按钮,如下所示:
[ ] 洗碗 [ ] 倒垃圾 [ ] 征服世界 ( 更新 )
每个待办事项都是数据库中的单独记录,具有“已完成”布尔字段。我希望该表单提交一个选中项目 ID 的列表到一个操作中,在该操作中,我可以将每个项目的“已完成”字段设置为 true,这将从视图中隐藏它们。
我知道如何创建引用多个模型的表单,但不知道如何创建引用同一模型的多个记录的表单。有什么建议吗?
谢谢!

1
你能发布一下你当前的控制器代码吗? - csexton
我还没有任何东西;我仍在概念上考虑如何设置表单以将数据传递给控制器。 - Grant Heaslip
4个回答

26

Railscasts是你的好朋友!

http://railscasts.com/episodes/52-update-through-checkboxes

它非常简单:

# routes.rb
map.resources :tasks, :collection => { :complete => :put }

# tasks_controller.rb
def complete
  Task.update_all(["completed_at=?", Time.now], :id => params[:task_ids])
end

# views\tasks\complete.html.erb
<% form_tag complete_tasks_path, :method => :put do %>
  <ul>
  <% for task in @incomplete_tasks %>
    <li>
      <%= check_box_tag "task_ids[]", task.id %>
      <%= task.name %>
    </li>
  <% end %>
  </ul>
  <%= submit_tag "Mark as Complete" %>
<% end %>

谢谢Luke,这似乎是我正在寻找的东西。 - Grant Heaslip
标签不应该放在<label>标签内部吗? - Marc-André Lafortune
你需要使用<%=而不是<%来输出form_tag。 - Jeff Steil

2

哇,这个时机太巧了。在我阅读器里这个问题之前的一篇文章是 Ryan Bates 最新的 railscast,看起来正好涵盖了你所问的内容。


1
为什么不使用远程函数在项目被选中时更新数据库,并完全摆脱更新按钮呢?

我考虑以后再加入 JS,但现在我想先让它不依赖 JS 运行,因为似乎这样会让调试变得更困难(至少我是这样认为的),而且现在我可能会犯很多愚蠢的错误。 - Grant Heaslip

0

既然在创建表单时可以包含每个记录的ID,那么您希望控制器迭代您发布的项目,然后相应地查找和更新每个记录。


我想我明白你的意思了;在非模态form_tag表单中,使用待办事项的ID为每个复选框命名,然后在控制器中迭代哈希表并相应地修改记录?在这种方法中是否存在任何潜在问题需要我注意? - Grant Heaslip

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接