Michael Hartl Ruby on Rails教程第11章NoMethodError:未定义的方法`microposts'为零:NilClass

时间:2016-01-07 23:52:25

标签: ruby-on-rails null associations

我试图关注迈克尔·哈特尔的Ruby on Rails教程,而我目前仍然坚持第11章。我不知道如何解决这些错误:

1) Error:
UsersIndexTest#test_index_as_admin_including_pagination_and_delete_links:
NoMethodError: undefined method `microposts' for nil:NilClass
    app/controllers/users_controller.rb:14:in `index'
    test/integration/users_index_test.rb:12:in `block in <class:UsersIndexTest>'


2) Error:
UsersIndexTest#test_index_as_non-admin:
NoMethodError: undefined method `microposts' for nil:NilClass
    app/controllers/users_controller.rb:14:in `index'
    test/integration/users_index_test.rb:29:in `block in     <class:UsersIndexTest>'

中的问题代码
app/controllers/users_controller.rb

是第14行,或@microposts = @user.microposts.paginate(page: params[:page])。我添加它后,测试开始失败。

 def index
    @users = User.paginate(page: params[:page])
    @microposts = @user.microposts.paginate(page: params[:page])
 end

我认为协会存在问题,但我有

class Micropost < ActiveRecord::Base
belongs_to :user
.
.
.
end

class User < ActiveRecord::Base
  has_many :microposts
  .
  .
  .
end

我的一些测试也适用于@ user.micropost

class MicropostTest < ActiveSupport::TestCase

  def setup
   @user = users(:michael)
   @micropost = @user.microposts.build(content: "Lorem ipsum")
 end

 test "should be valid" do
    assert @micropost.valid?
 end

所以我不知道出了什么问题。如果有人能提供帮助那就太棒了。

2 个答案:

答案 0 :(得分:1)

我认为你希望@microposts能够参加节目动作。

答案 1 :(得分:0)

您的索引方法会分配@users实例变量。然后,您尝试在尚未分配的microposts(注意不是复数)变量上调用@user。在ruby中,尚未赋值的任何实例变量都是nil

我不清楚你要完成什么,但你只能在单个microposts对象的实例上调用User,而不是像你已分配的那样集合到@users