2016-07-20 8 views
0

I持って以下のRailsコントローラとビューコード:レールのActiveRecord参照minitestで

discussion_thread_controller.rb

class DiscussionThreadsController < ApplicationController 
    before_action :set_discussion_thread, only: [:show, :edit, :update, :destroy] 
    def show 
    end 

    private 
    # Use callbacks to share common setup or constraints between actions. 
    def set_discussion_thread 
    @discussion_thread = DiscussionThread.find(params[:id]) 
    end 
end 

show.html.erb

<div class="panel panel-default"> 
    <div class="panel-heading"> 
    <%= @discussion_thread.author.name %><br> 
    <small><strong>at: </strong><%= @discussion_thread.created_at.strftime('%d-%m-%Y, %H:%M %P')%></small> 
    </div> 
    <div class="panel-body"><%= @discussion_thread.body %></div> 
</div> 

そしてこのminitest

class DiscussionThreadsControllerTest < ActionController::TestCase 
    setup do 
    @discussion_thread = discussion_threads(:one) 
    @board = boards(:board_2) 
    @user = users(:user_1) 
    end 

    test "should show discussion_thread" do 
    get :show, params: {id: @discussion_thread.id} 
    assert_response :success 
    end 
end 

ブラウザからコントローラにアクセスすると、たとえばhttp://localhost:3000/discussion_threads/980190963と表示され、ページが正しくレンダリングされます。テストが「作者」を実行したときに、デバッガでコードを通過するから、表示されます

Minitest::UnexpectedError: ActionView::Template::Error: undefined method `name' for nil:NilClass 

でdiscussion_thread.author.name @レンダリングしようとすると、テストが失敗しているいくつかの理由

メソッドはnilを返し、ブラウザーからアクセスするときは対応する「User」オブジェクトを返します。また、@discussion_thread属性を調べると、有効な "author_id"が表示されます。

どうしてですか?

class DiscussionThread < ApplicationRecord 
    validates :title, presence: true 
    validates :author_id, presence: true 

    belongs_to :board, class_name: 'Board', foreign_key: 'board_id' 
    belongs_to :author, class_name: 'User', foreign_key: 'author_id' 

    has_many :replies, class_name: 'Post', foreign_key: 'thread_id', dependent: :destroy 
end 

と私のテストフィクスチャ:

discussion_threads.yml

one: 
    title: MyString 
    body: MyText 
    board: board_2 
    author: user_1 

two: 
    title: MyString 
    body: MyText 
    board: board_2 
    author: user_1 

user_1: 
    id: 1 
    username: admin 
    email_address: [email protected] 
    password_digest:... 
    name: Mr. Foo 
    is_admin: true 

答えて

0

Accordinをusers.yml

マイdiscussion_threadモデルは次のようになりActiveRecord fixtures documentationにG:

  • 安定し、自動生成されたIDが
  • 協会(belongs_toの、has_oneの、has_manyの)ため
  • ラベル参照
  • 備品IDを指定していないいくつかの余分な機能を取得します

  • インラインリストとしてのHABTMの関連付け

idが0であっても利用可能ないくつかの高度な機能があります指定:上記報告した行動を起こしたものですYAMLのデフォルト

ため

  • 自動入力のタイムスタンプ列
  • フィクスラベル補間
  • サポート。フィクスチャからidフィールドを削除することで問題が解決されました。つまり、関連付けが機能することができました。

    私は、フィクスチャレコードIDを指定したときにこれらの機能が利用できないのはなぜかと思います。

関連する問題