所以基本上我有一个包含
等信息的Book模型现在在前端我添加了动态添加更多作者字段的功能。在我将其命名为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
字段之前的一些处理。我该怎么办?
谢谢你们。
答案 0 :(得分:0)
对于第一个问题:我认为没有任何令人信服的理由。 JavaScript可以提供更多的功能来“实时”验证/修复此字段中的格式,但我不确定这是否特别重要。
关于第二个问题:你不需要创造一些真正的属性,以使其可访问。您可能使用coauthor
将attr_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]可能会更好,因为这对create
和update
都有效。无论哪种方式,我希望有所帮助。