无法访问类nil Rails 4的对象

时间:2017-03-17 15:12:53

标签: ruby-on-rails ruby ruby-on-rails-4 testing embedded-ruby

我在Rails 4中进行测试得到了这个errormsg

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

&GT;

对于文章

,模型看起来像这样
  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

测试提供了错误消息,而在localhost中它可以正常工作。

修改 测试数据库填充了固定装置。

文章夹具

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

1 个答案:

答案 0 :(得分:1)

article灯具未正确引用state灯具。

而不是通过固定state引用id(您在灯具中使用:state_id: 1),而不是在您的州灯具中为每个state指定正确的名称并使用这个名字是这样的:state: valid_state

引用Rails Guide关于如何使用灯具中的关联:

  

如果您正在使用关联,则只需在两个不同的灯具之间定义参考节点即可。以下是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
     

请注意,category中找到的first文章的fixtures/articles.yml密钥的值为about。这告诉Rails加载fixtures/categories.yml中找到的类别。

     

对于通过名称彼此引用的关联,您可以使用fixture名称而不是在关联的fixture上指定id:属性。 Rails将自动分配主键,以便在运行之间保持一致。 [...]