2015-01-02 106 views
7

我收到此錯誤信息多態關聯:單元測試與燈具

ERROR["test_profile_display", UsersProfileTest, 2.569931] test_profile_display#UsersProfileTest (2.57s) 
NoMethodError:   NoMethodError: undefined method `posts' for nil:NilClass 
     app/controllers/users_controller.rb:14:in `show' 
     test/integration/users_profile_test.rb:22:in `block in <class:UsersProfileTest>' 
    app/controllers/users_controller.rb:14:in `show' 
    test/integration/users_profile_test.rb:22:in `block in <class:UsersProfileTest>' 

它在該行@posts = @user.character.posts.paginate(page: params[:page])似乎character在UsersController爲零。用戶和角色之間存在多態關係。我以爲我已經使用了正確的語法夾具來告訴用戶Bazley有一個固定的軌道: 在characters.yml:

character_bazley: 
    sociable: bazley (user) 

我如何說服軌用戶燈具確實有一個屬於字符到它?

測試/集成/ users_profile_test.rb:

require 'test_helper' 

class UsersProfileTest < ActionDispatch::IntegrationTest 
    include ApplicationHelper 

    def setup 
    @user = users(:bazley) 
    end 

    test "profile display" do 
    log_in_as(@user) 
    get user_path(@user) 
    assert_template 'users/show' 
    assert_select 'title', full_title(@user.name) 
    assert_select 'h1', text: @user.name 
    assert_select 'h1>img.gravatar' 
    assert_match @user.character.posts.count.to_s, response.body 
    assert_select 'div.pagination' 
    @user.character.posts.paginate(page: 1).each do |post| 
     assert_match post.content, response.body 
    end 
    end 
end # UsersProfileTest 

user.rb:

class User < ActiveRecord::Base 

    attr_accessor :remember_token, :activation_token, :reset_token 
    has_one :character, as: :sociable, dependent: :destroy 
    . 
    . 
end 

character.rb:

class Character < ActiveRecord::Base 

    belongs_to :sociable, polymorphic: true 
    has_many :posts, dependent: :destroy 
    validates :sociable_id, presence: true 
end # Character 

users.yml裏:

bazley: 
    name: Bazley 
    email: [email protected] 
    callsign: bazley 
    password_digest: <%= User.digest('password') %> 
    admin: true 
    activated: true 
    activated_at: <%= Time.zone.now %> 

characters.yml:

character_bazley: 
    sociable: bazley (user) 

在UsersController:

def show 
    @user = User.find_by_callsign(params[:callsign]) 
    @posts = @user.character.posts.paginate(page: params[:page]) # the line causing the error 
    @page_name = "user_page" 
    redirect_to root_url and return unless @user.activated 
end 

回答

8

變化characters.yml

character_bazley: 
    sociable: bazley (User) 

代替

character_bazley: 
    sociable: bazley (user) 

Ñ注意它是User而不是user。這裏使用的關鍵字User將告訴sociable_typeUser類。

編號:

http://ruby-journal.com/rails/define-fixtures-with-polymorphic-association/ http://api.rubyonrails.org/v3.2.8/classes/ActiveRecord/Fixtures.html#label-Polymorphic+belongs_to

+0

哦,親愛的,大寫字母......我像個傻瓜。 謝謝。 – Bazley