2017-03-17 51 views
1

我得到這個ERRORMSG從軌道4,5做測試無法訪問類的對象零軌道4

Error: 
ArticlesControllerTest#test_x: 
ActionView::Template::Error: undefined method `state' for nil:NilClass 

在這條線在視圖中出現的錯誤:

<% @articles.each do |article| %> 
    <div id="article-container"> 
     <div id="article-content"> 
     <ul> 
      <li> <b>Status:</b> <%= article.status_id %></li> 
      <li> <b>State:</b> <%= article.state.state %></li 

>

該模型看起來像這樣的文章

belongs_to :user 
    belongs_to :book, primary_key: :ISBN, foreign_key: :ISBN 
    has_one :state, primary_key: :states_id, foreign_key: "id" 
    has_one :status, primary_key: :status_id, foreign_key: "id" 

    has_and_belongs_to_many :courses 

    validates :ISBN, presence: true 
    validates :states_id, presence: true 
    validates :user_id, presence: true 
    validates :price, presence: true 
    validates :status_id, presence: true 

這是文章和模式狀態表

文章表:

create_table "articles", force: :cascade do |t| 
    t.string "ISBN" 
    t.integer "user_id" 
    t.integer "price" 
    t.integer "status_id" 
    t.datetime "created_at", null: false 
    t.datetime "updated_at", null: false 
    t.integer "states_id" 
    t.index ["states_id"], name: "index_articles_on_states_id" 
    end 

國表:

create_table "states", force: :cascade do |t| 
    t.string "state" 
    t.datetime "created_at", null: false 
    t.datetime "updated_at", null: false 
    end 

問題是運行這個測試(表明從頂部文件,直到有問題的測試):

require 'test_helper' 

class ArticlesControllerTest < ActionDispatch::IntegrationTest 
    include Devise::Test::IntegrationHelpers 
    setup do 
    @article_normal = articles(:normal_article) 
    @article_admin = articles(:admin_article) 
    @normal_user = users(:normal_user) 
    @admin_user = users(:admin_user) 

    @normal_user.id = @article_normal.user_id 
    @admin_user.id = @article_admin.user_id 
    end 
    test "test x" do 
    get articles_url 
    assert_response :success 
    end 

該測試提供了錯誤消息,而在本地主機上它工作。

編輯 測試數據庫中填充了燈具。

條燈具

normal_article: 
    ISBN: 9788252179675 
    user_id: 1 
    price: 500 
    states_id: 1 
    status_id: 1 


admin_article: 
    ISBN: 9788252179675 
    user_id: 2 
    price: 400 
    states_id: 1 
    status_id: 1 

控制器方法從article_controller:

# GET /articles 
    # GET /articles.json 
    def index 
    @articles = Article.all 
    @courses = Course.all 
    @states = State.all 
    if params[:search] 
     @articles = Article.search(params[:search]) 
    else 
     @articles = Article.all 
    end 
    end 
+0

是否在測試運行之前在測試數據庫中的文章模型中填充數據? –

+0

文章被填充,因爲我已經測試過了。問題在於訪問狀態表,也許有一些與我錯過的關係有關。根據測試,我可以訪問'article.states_id'和'article.state',但不能訪問'article.state.state'。在localhost中查看 – Aleins

+0

現在就完成了大部分工作 – Aleins

回答

1

article燈具沒有正確引用state燈具。

而是通過引用state的固定id(你使用:state_id: 1在夾具),給你的狀態燈具各state一個適當的名稱,並使用這個名字是這樣的:從state: valid_state


報價在Rails Guide如何與協會燈具工作:

如果與協會合作,你可以簡單地定義兩個不同的fixtu之間的參考節點水庫。下面是一個例子與belongs_to/has_many協會:

# In fixtures/categories.yml 
about: 
name: About 

# In fixtures/articles.yml 
first: 
    title: Welcome to Rails! 
    body: Hello world! 
    category: about 

注意在fixtures/articles.yml發現first文章的category關鍵有about值。這告訴Rails加載在fixtures/categories.yml中找到的類別。

對於關聯可以通過名稱相互引用,您可以使用燈具名稱而不是在關聯的燈具上指定id:屬性。 Rails會自動分配一個主鍵以保持運行之間的一致性。 [...]