如何使用rails app中的嵌套资源修复未定义的方法错误?

时间:2013-05-04 16:30:44

标签: ruby-on-rails resources

当我访问

时,我收到一条错误说“未定义的方法`经文'为nil:NilClass”
/books/1/chapters/1/verses/new

我的routes.rb:

resources :books do
  resources :chapters do
    resources :verses
  end
end

verse_controller.rb:

class VersesController < ApplicationController
    before_filter :find_book
    before_filter :find_chapter, :only => [:show, :edit, :update, :destroy]

    def new
        @verse = @chapter.verses.build
    end


    private
    def find_book
        @book = Book.find(params[:book_id])
    end

    def find_chapter
        @chapter = Chapter.find(params[:chapter_id])
    end

end

关于如何解决这个问题的任何建议?

1 个答案:

答案 0 :(得分:0)

问题在于你的before_filter

before_filter :find_chapter, :only => [:show, :edit, :update, :destroy]

现在您点击了new,但before_filter没有触发new,因此@chapter为零。

解决方案:将:new添加到唯一的数组中。

更新使用params获取ID的方式不正确,params用于查询字符串或POST。你需要额外的努力来从路径中获取参数。

before_filter: get_resources # Replace your two filters

private
def get_resources
  book_id, chapter_id = request.path.split('/')[1, 3]
  @book    = Book.find(book_id)
  @chapter = Chapter.find(chapter_id)
end