Rails:保存前加入多个临时字段

时间:2013-01-25 20:12:05

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

所以基本上我有一个包含

等信息的Book模型
  • 书名(字符串)
  • 作者(字符串)
  • description(text)

现在在前端我添加了动态添加更多作者字段的功能。在我将其命名为book[coauthor]的表单中,如果我添加第二位作者,则会有一个字段book[coauthor][name_0]

我想要实现的是将book[author]和所有book[coauthor][name_i]合并为一个大字符串,并将每个名称与,分开。 (即book[author]为“Alice”且book[coauthor][name_0]为“Bob”,我应该将“Alice,Bob”保存在DB中的book[author]

第一个问题:此时使用Javascript或Rails(在控制器中)更好吗?

第二个问题:目前我在Rails控制器中执行此操作但得到Can't mass-assign protected attribute 'coauthor'。但是我不想让它成为一个真正的属性,因为我需要的是在将所有信息保存到author字段之前的一些处理。我该怎么办?

谢谢你们。

2 个答案:

答案 0 :(得分:0)

对于第一个问题:我认为没有任何令人信服的理由。 JavaScript可以提供更多的功能来“实时”验证/修复此字段中的格式,但我不确定这是否特别重要。

关于第二个问题:你不需要创造一些真正的属性,以使其可访问。您可能使用coauthorattr_accessor创建为虚拟属性,但这并不会自动将其添加到批量分配白名单中。为此,请将其添加到您的attr_accessible列表中。

答案 1 :(得分:0)

第一个问题是有点加载,你可能会遇到一些激烈的分歧,但我看待它的方式就是这个。并非每个人都启用了Javascript,所以我确保自己有办法通过Rails完成所有工作。

在这种情况下,它实际上很容易。

我建议的第一件事是不要将共同作者作为params[:book]的一部分发送。而是将它们作为params[:coauthors]单独发送。然后在你的控制器中你可以这样做:

@book = Book.new(params[:book])
@book.author = ([@book.author] + [params[:coauthors]]).join(",")
@book.save

实际上,更新params [:book] [:author]可能会更好,因为这对createupdate都有效。无论哪种方式,我希望有所帮助。