所以基本上我有一个包含以下信息的书籍模型
- 书名(字符串)
- 作者(字符串)
- 说明(文本)
- 等。
现在在前端,我添加了动态添加更多作者字段的功能。在我将其命名为book[coauthor]
的形式中,因此,如果我添加第二作者,我将有一个字段book[coauthor][name_0]
。
我想实现的是将book[author]
和所有book[coauthor][name_i]
组合成一个大字符串,并用,
分隔每个名称。(也就是说,book[author]
是"爱丽丝",book[coauthor][name_0]
是"鲍勃",我应该在数据库中book[author]
保存"爱丽丝,鲍勃")
第一个问题:在这一点上,使用Javascript还是使用Rails(在控制器中)更好?
第二个任务:目前我在 Rails 控制器中执行此操作,但Can't mass-assign protected attribute 'coauthor'
.但是,我不想使其成为真正的属性,因为我只需要在将所有信息保存到author
字段之前进行一些处理。我该怎么办?
谢谢大家。
第一个问题有点沉重,你可能会得到一些激烈的分歧,但我看待它的方式是这样的。不是每个人都在启用Javascript的情况下运行,所以我确保我自己有办法通过Rails做所有事情。
在这种情况下,这实际上很容易。
我建议的第一件事是不要将合著者作为params[:book]
的一部分发送。相反,请将它们作为params[:coauthors]
单独发送。然后在控制器中,您可以执行以下操作:
@book = Book.new(params[:book])
@book.author = ([@book.author] + [params[:coauthors]]).join(",")
@book.save
实际上,更新参数[:book][:author]可能会更好,因为这对create
和update
都有效。无论哪种方式,我希望这有所帮助。
对于第一个问题:我看不出有任何令人信服的理由。JavaScript 可能会提供更多"实时"验证/修复此字段中格式的能力,但我不确定这是否特别重要。
对于第二个问题:你不需要为了让某些东西变得可访问而成为一个真正的属性。您可能已经使用 attr_accessor
创建了coauthor
作为虚拟属性,但这不会自动将其添加到批量分配白名单中。为此,请将其添加到您的attr_accessible
列表中。