Ruby-on-rails – Rails 3: How to create a new nested resource

ruby-on-railsruby-on-rails-3

The Getting Started Rails Guide kind of glosses over this part since it doesn't implement the "new" action of the Comments controller. In my application, I have a book model that has many chapters:

class Book < ActiveRecord::Base
  has_many :chapters
end

class Chapter < ActiveRecord::Base
  belongs_to :book
end

In my routes file:

resources :books do
  resources :chapters
end

Now I want to implement the "new" action of the Chapters controller:

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

What is the right way to do this? Also, What should the view script (form) look like?

Best Answer

First you have to find the respective book in your chapters controller to build a chapter for him. You can do your actions like this:

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

In your form, new.html.erb

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

or you can try a shorthand

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

Hope this helps.

Related Topic