2012-02-20 94 views
5

我有一个无表模型,我试图为其生成一些表单字段。Rails 3和fields_for with activemodel(tableless)object

的形式看起来像这样:

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

这意味着当提交表单时只有最后一个输入字段可用作previo我们两人已被覆盖,因为他们引用了同样的事情。

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

有什么建议吗?

回答

7

我认为你需要把它添加到您的用户模型

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

而且还定义Book实例persisted?方法。只是为了返回false

并添加ffields_for鉴于:

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

我希望这会工作。

0

Welldan97提出了一个非常重要的观点。你需要持久的?方法。我之前得到了一个未定义的模型名称的方法。检查我的要点。它工作,但不是完美的任何手段。 https://gist.github.com/2638002

0

现在,这很难用Rails 3.x. Rails 4会随着ActiveModel::Model的出现而改变,这将使您的模型的所有基本方法兼容。

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

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

class Book 
    include ActiveModel::Model 
end 

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

0

试试这个:

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