我有一个无表格模型,我正在尝试为。生成一些表单字段。
表单如下:
= 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">
这意味着当提交表单时,只有最后一个输入字段可用,因为前两个字段已被覆盖,因为它们引用了相同的内容。
当模型具有活动记录后端时,这种方法可以正常工作,但是当它没有表格时,则无效。
有什么建议吗?
答案 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|