Rails 3: Как создать новый вложенный ресурс? - PullRequest
64 голосов
/ 24 сентября 2010

Руководство по началу работы с Rails скрывает эту часть, поскольку не реализует "новое" действие контроллера Comments. В моем приложении у меня есть книжная модель, которая имеет много глав:

class Book < ActiveRecord::Base
  has_many :chapters
end

class Chapter < ActiveRecord::Base
  belongs_to :book
end

В моем файле маршрутов:

resources :books do
  resources :chapters
end

Теперь я хочу реализовать «новое» действие контроллера Chapters:

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

Как правильно это сделать? Кроме того, как должен выглядеть скрипт вида (форма)?

Ответы [ 3 ]

121 голосов
/ 28 сентября 2010

Сначала вы должны найти соответствующую книгу в вашем контроллере глав, чтобы построить для него главу. Вы можете делать свои действия так:

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

В вашей форме new.html.erb

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

или вы можете попробовать стенографию

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

Надеюсь, это поможет.

6 голосов
/ 24 сентября 2010

Попробуйте @chapter = @book.build_chapter. Когда вы звоните @book.chapter, это ноль. Вы не можете сделать nil.new.

РЕДАКТИРОВАТЬ : я только что понял, что книга, скорее всего, главы has_many ... выше для has_one. Вы должны использовать @chapter = @book.chapters.build. Главы «пустой массив» на самом деле являются специальным объектом, который отвечает на build для добавления новых ассоциаций.

1 голос
/ 20 ноября 2015

Возможно, не связано, но из заголовка этого вопроса вы можете прийти сюда в поисках того, как сделать что-то немного другое.

Допустим, вы хотите сделать Book.new(name: 'FooBar', author: 'SO') и вы хотите разделить некоторые метаданные в отдельную модель, называемый readable_config, который является полиморфным и хранит name и author для нескольких моделей.

Как принять Book.new(name: 'FooBar', author: 'SO') для построения модели Book, а также модели readable_config (который я, возможно, ошибочно назвал бы «вложенным ресурсом»)

Это можно сделать так:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...