Rails 3和fields_for与activemodel(无表格)对象

时间:2012-02-20 13:10:36

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

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

表单如下:

= 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">

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

当模型具有活动记录后端时,这种方法可以正常工作,但是当它没有表格时,则无效。

有什么建议吗?

4 个答案:

答案 0 :(得分:7)

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

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

并为Book实例定义persisted?方法。只需返回false

在视图中为f添加fields_for

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

我希望这会奏效。

答案 1 :(得分:0)

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

答案 2 :(得分:0)

目前,使用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兼容性。

答案 3 :(得分:0)

试试这个:

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