2012-02-20 18 views
5

Tengo un modelo sin tablas para el que intento generar algunos campos de formulario.Rails 3 y fields_for with activemodel (tableless) object

El formulario se ve así:

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

Lo que estoy esperando que se generará para cada campo es algo como esto:

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

Sin embargo, lo que estoy consiguiendo realmente es

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

Lo que significa que cuando se envía el formulario, solo el último campo de entrada está disponible como el anterior nosotros dos hemos sido sobrescritos debido a que hacen referencia a lo mismo.

Esto funciona bien cuando el modelo tiene un backend de registro activo pero no cuando no tiene tabla.

¿Alguna sugerencia?

Respuesta

7

creo que es necesario agregar esto a su modelo usuarios

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

Y también definir persisted? método por ejemplo libro. Haga solo para devolver false.

Y añadir f para su fields_for a la vista:

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

espero que esto va a funcionar.

0

Welldan97 trae a colación un punto muy importante. Necesitas el persistido? método. Estaba obteniendo un método indefinido para el nombre del modelo anteriormente. Comprueba mi esencia. Funciona, pero no es perfecto de ninguna manera. https://gist.github.com/2638002

0

En este momento esto es bastante difícil de hacer con Rails 3.x. Eso cambiará con Rails 4 con la llegada de ActiveModel::Model que dará todos los métodos básicos para que su modelo sea compatible con ActionPack.

Sin embargo, hasta que se publique Rails 4, un buen estándar para que su modelo ActionPack sea compatible es el propio módulo ActionModel::Model. "Debería" funcionar con los Rieles estables actuales. Check it out

Cómo elige implementar esta es su decisión, pero probablemente solo descargue el archivo y lo lance en el directorio lib de mi aplicación. De esa manera podría simplemente incluirlo usando

class Book 
    include ActiveModel::Model 
end 

Easy Rails Compatibilidad de la forma para los modelos personalizados.

0

Prueba esto:

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