2015-01-02 8 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]) में UsersController में character लगता नहीं के बराबर है। उपयोगकर्ताओं और पात्रों के बीच एक बहुलक संबंध है। मैंने सोचा कि मैं जुड़नार में सही सिंटैक्स का इस्तेमाल किया था रेल उपयोगकर्ता 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) 

एन होने के लिए ote यह 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

संबंधित मुद्दे