Rails 3: ¿Cómo crear un nuevo recurso nested?

El tipo de Guía de Rastros iniciales comienza en esta parte, ya que no implementa la acción “nueva” del controlador de Comentarios. En mi aplicación, tengo un modelo de libro que tiene muchos capítulos:

class Book < ActiveRecord::Base has_many :chapters end class Chapter < ActiveRecord::Base belongs_to :book end 

En mi archivo de rutas:

 resources :books do resources :chapters end 

Ahora quiero implementar la acción “nueva” del controlador de capítulos:

 class ChaptersController < ApplicationController respond_to :html, :xml, :json # /books/1/chapters/new def new @chapter = # this is where I'm stuck respond_with(@chapter) end 

¿Cuál es la forma correcta de hacer esto? Además, ¿cómo debería verse el script de vista (formulario)?

Primero tienes que encontrar el libro respectivo en el controlador de tus capítulos para construir un capítulo para él. Puedes hacer tus acciones así:

 class ChaptersController < ApplicationController respond_to :html, :xml, :json # /books/1/chapters/new def new @book = Book.find(params[:book_id]) @chapter = @book.chapters.build respond_with(@chapter) end def create @book = Book.find(params[:book_id]) @chapter = @book.chapters.build(params[:chapter]) if @chapter.save ... end end end 

En su formulario, new.html.erb

 form_for(@chapter, :url=>book_chapters_path(@book)) do .....rest is the same... 

o puedes probar una taquigrafía

 form_for([@book,@chapter]) do ...same... 

Espero que esto ayude.

Prueba con @chapter = @book.build_chapter . Cuando llamas a @book.chapter , es nulo. No puedes hacer nil.new .

EDITAR : Me acabo de dar cuenta de que el libro probablemente tiene muchos capítulos … lo anterior es para has_one. Debe utilizar @chapter = @book.chapters.build . Los capítulos “matriz vacía” es en realidad un objeto especial que responde a la build para agregar nuevas asociaciones.

Quizás no relacionado, pero a partir del título de esta pregunta puede llegar aquí buscando cómo hacer algo ligeramente diferente.

Digamos que quieres hacer Book.new(name: 'FooBar', author: 'SO') y quieres dividir algunos metadatos en un modelo separado, llamado readable_config que es polimórfico y almacena el name y el author de varios modelos.

¿Cómo acepta Book.new(name: 'FooBar', author: 'SO') para construir el modelo de Book y también el modelo readable_config (que, quizás, erróneamente, llamaría ‘recurso nested’)

Esto se puede hacer así:

 class Book < ActiveRecord::Base has_one :readable_config, dependent: :destroy, autosave: true, validate: true delegate: :name, :name=, :author, :author=, :to => :readable_config def readable_config super ? super : build_readable_config end end