2012-02-20 92 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|