私自身の教育のために、Rails を使用して非常に単純なブログを作成しようとしています。チュートリアル以外で作成した Rails アプリはこれが初めてです。
これまでのところ、各投稿にはタイトルの文字列とコンテンツの文字列のみを持つ非常に単純なモデルしかありません。すべてが正常に機能し、ブラウザで期待どおりに動作しますが、テストに合格できません。
私のRspecコード(spec/requests/post_spec.rb)で失敗したテストは次のとおりです。
require 'spec_helper'
describe "Posts" do
.
.
.
describe "viewing a single post" do
@post = Post.create(title: "The title", content: "The content")
before { visit post_path(@post) }
it { should have_selector('title', text: @post.title) }
it { should have_selector('h1', text: @post.title) }
it { should have_selector('div.post', text: @post.content) }
end
end
これにより、3つすべてに対して同じエラーメッセージが表示されます。
Failure/Error: before { visit post_path(@post) }
ActionController::RoutingError:
No route matches {:action=>"show", :controller=>"posts", :id=>nil}
したがって、問題は @post = Post.create(...) 行が ID なしで投稿を作成しているか、投稿をテスト データベースに正しく保存していないことです。これを修正するにはどうすればよいですか? そもそも私はこれを正しい方法で行っているのでしょうか、それともテスト投稿を作成したりページをテストしたりするためのより良い方法はありますか?
これは、テストでのみ発生する問題です。ブラウザで 1 つの投稿を表示すると、すべて問題なく表示されます。投稿コントローラーは次のとおりです。(元の質問を投稿してから編集しました)
class PostsController < ApplicationController
def new
@post = Post.new
end
def create
@post = Post.new(params[:post])
if @post.save
redirect_to posts_path, :notice => "Post successfully created!"
end
end
def index
end
def show
@post = Post.find(params[:id])
end
end
Post モデル全体を次に示します。
class Post < ActiveRecord::Base
attr_accessible :content, :title
validates :content, presence: true
validates :title, presence: true
end
構成/ルート:
Blog::Application.routes.draw do
resources :posts
root to: 'posts#index'
end
アプリ/ビュー/投稿/show.html.erb:
<% provide(:title, @post.title) %>
<h1><%= @post.title %></h1>
<div class="post"><%= @post.content %></div>