我正在尝试使用 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 的帖子,或者它没有正确地将帖子保存到测试数据库中。我该如何解决?我是否首先以正确的方式解决这个问题,还是有更好的方法可以创建测试帖子/测试页面?
这只是测试中的一个问题。当我在浏览器中查看单个帖子时,一切看起来都很好。Posts 控制器是:(自发布原始问题以来,我已对其进行了编辑)
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
应用程序/views/posts/show.html.erb:
<% provide(:title, @post.title) %>
<h1><%= @post.title %></h1>
<div class="post"><%= @post.content %></div>