2011-09-02 17 views
5

Estoy usando Rails 3.1 y estoy trabajando en un foro de discusión. Tengo un modelo llamado Topic, cada uno de los cuales tiene muchos Post s. Cuando el usuario hace un nuevo tema, también debe hacer el primero Post también. Sin embargo, no estoy seguro de cómo puedo hacer esto de la misma forma. Aquí está mi código:¿Múltiples modelos en la misma forma en Rails 3.1?

<%= form_for @topic do |f| %> 
<p> 
    <%= f.label :title, "Title" %><br /> 
    <%= f.text_field :title %> 
</p> 

<%= f.fields_for :post do |ff| %> 
    <p> 
     <%= ff.label :body, "Body" %><br /> 
     <%= ff.text_area :body %> 
    </p> 
<% end %> 

<p> 
    <%= f.submit "Create Topic" %> 
</p> 
<% end %> 

class Topic < ActiveRecord::Base 
    has_many :posts, :dependent => :destroy 
    accepts_nested_attributes_for :posts 
    validates_presence_of :title 
end 


class Post < ActiveRecord::Base 
    belongs_to :topic 
    validates_presence_of :body 
end 

... pero esto no parece estar funcionando. ¿Algunas ideas?

Gracias!

Respuesta

6

@ La respuesta de Pablo parece tener todo lo que necesita. Sin embargo, para ser más específicos ...

Primer cambio de esta línea en su vista desde

<%= f.fields_for :post do |ff| %> 

a este

<%= f.fields_for :posts do |ff| %> # :posts instead of :post 

Luego, en su controlador Topic añadir esta

def new 
    @topic = Topic.new 
    @topic.posts.build 
end 

Eso te ayudara a llegar.

+0

+1 para el ejemplo real. – Joseph

3

una muy buena explicación de Ryan Bates here y here

para su caso particular: está utilizando un modelo (: post), en lugar de una asociación (: mensajes) cuando se llama fields_for.

También verifique el uso correcto de <%= ... %>. En los carriles 3.x el comportamiento de la construcción cambió. Los bloqueadores (form_for, fields_for, etc.) no lo necesitan y los helpers en línea (text_field, text_area, etc.) lo necesitan.

+0

Gracias por el enlace, pero estaba buscando algo específico para mi pregunta. – jasonbogd

Cuestiones relacionadas