基于 Rails 中的关联构建表单
Posted
技术标签:
【中文标题】基于 Rails 中的关联构建表单【英文标题】:Building Form Based On an Association in Rails 【发布时间】:2013-07-21 17:07:42 【问题描述】:我对 Rails 很陌生,在整理一个用于学习的简单页面时遇到了一些问题,我希望有人可以对修复或更好的方法提出一些建议。
基本上,我有便签本的概念。每个垫有_many 任务和has_many 笔记。在pad的展示中,我想要两个独立的表格。一种用于添加任务,一种用于添加注释。问题是,我像这样构建表单:
<%= form_for([@pad, @pad.tasks.build]) do |f| %>
<%= f.text_field :text %> <%= f.submit %>
<% end %>
现在,由于我调用了 .build,当我稍后调用下面的代码来呈现任务时,它总是会在列表中呈现一个额外的空记录。
<ul>
<%= render @pad.tasks %>
</ul>
我考虑过使用嵌套表单,但这似乎需要我使用 PadsController::Update 而不是 TasksController:Create 像我想要的那样。
在这种情况下,合适的方法是什么?对 Rails 如此陌生(昨天开始),恐怕我错过了一些明显的东西。
编辑:我将源代码添加到 github 存储库。正如我所说,这对我来说只是一个学习项目。 https://github.com/douglinley/scratchpad
【问题讨论】:
【参考方案1】:如果您只是想要一个新任务而不将其添加到@pad.tasks
集合中,我相信您可以只使用@pad.tasks.new
而不是@pad.tasks.build
(确实将其添加到集合中)。
有关构建与新建的更多信息,请查看 Build vs new in Rails 3
【讨论】:
感谢您的回复。根据那篇文章,看起来 Build 和 New 现在几乎相同(3.2.3 后),它们都将新记录添加到集合中。这是我要避免的。【参考方案2】:所以,这比我想象的要容易得多。我没有在集合上调用 new,而是为表单创建了一个新对象。示例如下:
<%= form_for([@pad, Task.new]) do |f| %>
<%= f.text_field :text %> <%= f.submit %>
<% end %>
【讨论】:
以上是关于基于 Rails 中的关联构建表单的主要内容,如果未能解决你的问题,请参考以下文章