2015-01-02 8 views
7

Dostaję komunikat o błędzie:Unit Testing polimorficzny skojarzenia z opraw

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>' 

Wydaje character w UsersController w linii @posts = @user.character.posts.paginate(page: params[:page]) jest zerowa. Istnieje polimorficzna relacja między użytkownikami i postaciami. Myślałam, że użył poprawnej składni w uchwyty do szyn powiedzieć, że użytkownik Bazley posiada urządzenia: W characters.yml:

character_bazley: 
    sociable: bazley (user) 

Jak mogę przekonać szyn że urządzenie użytkownik rzeczywiście mają charakter przynależności do tego?

test/integracja/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) 

W 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 

Odpowiedz

8

Zmiana characters.yml być

character_bazley: 
    sociable: bazley (User) 

zamiast

character_bazley: 
    sociable: bazley (user) 

N Uwaga: jest to User, a nie user. Słowo kluczowe użyte tutaj User powie, że klasa sociable_type ma klasę User.

Ref:

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

Och, dużą literą ... Jestem pała. Dziękuję. – Bazley

Powiązane problemy