Rails 3:如何创build一个新的嵌套资源?
由于它没有实现评论控制器的“新”动作,因此入门Rails指南对这部分有些迷惑。 在我的应用程序中,我有一个有许多章节的书籍模型:
class Book < ActiveRecord::Base has_many :chapters end class Chapter < ActiveRecord::Base belongs_to :book end
在我的路线文件中:
resources :books do resources :chapters end
现在我要实现章节控制器的“新”动作:
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
什么是正确的方法来做到这一点? 另外,视图脚本(表单)应该是什么样的?
首先你必须在章节控制器中find相应的书来为他build立一个章节。 你可以这样做你的行为:
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...
希望这可以帮助。
试试@chapter = @book.build_chapter
。 当你打电话给@book.chapter
,它是零。 你不能做nil.new
。
编辑 :我刚刚意识到,这本书最有可能has_many章…上述是has_one。 你应该使用@chapter = @book.chapters.build
。 “空arrays”这个章节实际上是一个特殊的对象,它响应build
来添加新的关联。
也许是不相关的,但是从这个问题的标题你可能会到达这里寻找如何做一些稍微不同的事情。
假设你想做Book.new(name: 'FooBar', author: 'SO')
,你想把一些元数据分解成一个单独的模型,名为readable_config
,它是多态的,存储多个模型的name
和author
。
你如何接受Book.new(name: 'FooBar', author: 'SO')
来build立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