【问题标题】:Rails 3 and fields_for with activemodel (tableless) objectRails 3 和 fields_for 与 activemodel(无表)对象
【发布时间】:2012-02-20 13:10:35
【问题描述】:

我有一个无表模型,我正在尝试为其生成一些表单字段。

表格如下:

= form_for :users, url: users_path do |f|
  - books.each do |book|
    = f.fields_for :books, book do |bf|
      = bf.hidden_field :title, value: book.title
  = f.submit "Send"

我期望为每个字段生成的内容是这样的:

<input name="users[books][][title]" type="hidden" value="Some Book Title">
<input name="users[books][][title]" type="hidden" value="Some Book Title">
<input name="users[books][][title]" type="hidden" value="Some Book Title">

然而,我实际上得到的是

<input name="users[books][title]" type="hidden" value="Some Book Title">
<input name="users[books][title]" type="hidden" value="Some Book Title">
<input name="users[books][title]" type="hidden" value="Some Book Title">

这意味着当提交表单时,只有最后一个输入字段可用,因为前两个输入字段已被覆盖,因为它们引用了相同的内容。

当模型有一个活动记录后端时,这可以正常工作,但当它是无表时,则不行。

有什么建议吗?

【问题讨论】:

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


    【解决方案1】:

    我认为您需要将此添加到您的用户模型中

    def books_attributes= attributes
      # do something with attributes
      # probably:
      # self.books = attributes.map{|k,v|Book.new(v)}
    end
    

    并且还为 Book 实例定义 persisted? 方法。让它只返回false

    并在视图中为您的fields_for 添加f

    = f.fields_for :books, book do |bf|
    

    我希望这会奏效。

    【讨论】:

      【解决方案2】:

      Welldan97 提出了一个非常重要的观点。你需要坚持吗?方法。我之前得到了模型名称的未定义方法。检查我的要点。它有效,但无论如何都不完美。 https://gist.github.com/2638002

      【讨论】:

        【解决方案3】:

        现在这在 Rails 3.x 中很难做到。随着 ActiveModel::Model 的出现,Rails 4 将改变这种情况,这将使您的模型的所有基本方法都与 ActionPack 兼容。

        但是,在 Rails 4 发布之前,使您的模型 ActionPack 兼容的一个很好的标准是 ActionModel::Model 模块本身。它“应该”与当前稳定的 Rails 一起工作。 Check it out

        您选择如何实现这是您的决定,但我可能只是下载该文件并将其放入我的应用程序的lib 目录中。这样我就可以使用

        class Book
          include ActiveModel::Model
        end
        

        自定义模型的 Easy Rails Form 兼容性。

        【讨论】:

          【解决方案4】:

          试试这个:

          f.fields_for 'books[]', book do |bf|
          

          【讨论】:

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