【问题标题】:Rails: Joining multiple temp fields before saveRails:在保存之前加入多个临时字段
【发布时间】:2013-01-26 04:29:09
【问题描述】:

所以基本上我有一个包含类似信息的 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 字段之前,我只需要一些处理。我该怎么办?

谢谢大家。

【问题讨论】:

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


    【解决方案1】:

    第一个问题有点牵强,您可能会遇到一些激烈的分歧,但我的看法是这样的。不是每个人都在启用 Javascript 的情况下运行,所以我确保自己有办法通过 Rails 完成所有工作。

    在这种情况下,其实很简单。

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

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

    实际上,更新 params[:book][:author] 可能会更好,因为这对createupdate 都有效。不管怎样,我希望这会有所帮助。

    【讨论】:

      【解决方案2】:

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

      对于第二个问题:您无需将某物设为真实属性即可使其可访问。您可能已经使用attr_accessor 创建了coauthor 作为虚拟属性,但这不会自动将其添加到批量分配白名单中。为此,请将其添加到您的 attr_accessible 列表中。

      【讨论】:

        猜你喜欢
        • 2014-06-14
        • 1970-01-01
        • 2014-01-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多