基于 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 中的关联构建表单的主要内容,如果未能解决你的问题,请参考以下文章

如何根据 Rails 中的其他对象验证多对多关联?

如何在 Rails 4.0 表单中显示选定记录中的关联值

Rails 表单关联自动新建

Rails 3.2 - 在现有表单上添加新关联

如何在 Rails 4 中为多对多关联制作带有子表单的表单?

Ruby on Rails - 简单表单自动完成关联搜索