Я получаю следующую ошибку при запуске rspec spec / controllers / users_controller_spec.rb в разделе 7.3.1 учебника Майкла Хартла по Rails:
Failure/Error: get :show, :id => @user
ActionController::RoutingError:
No route matches {:id=>#<User id: 1, #rest is data from the factories.rb file....
Вот мой код для файла users_controller_spec.rb:
require 'spec_helper'
require 'factories'
describe UsersController do
render_views
describe "GET 'show'" do
before(:each) do
@user = Factory(:user)
end
it "should be successful" do
get :show, :id => @user
response.should be_success
end
it "should find the right user" do
get :show, :id => @user
assigns(:user).should == @user
end
end
describe "GET 'new'" do
it "should be successful" do
get 'new'
response.should be_success
end
it "should have the right title" do
get 'new'
response.should have_selector("title", :content => "Sign up")
end
end
end
Вот мой код factory.rb:
Factory.define :user do |user|
user.name "Michael Hartl"
user.email "mhartl@example.com"
user.password "foobar"
user.password_confirmation "foobar"
end
Я вставил эти строки в Spec_Helper в отношении 'factory_girl':
require 'factory_girl'
Factory.find_definitions
Есть идеи, что является причиной ошибки маршрутизации?
Вот мой код route.rb:
SampleApp::Application.routes.draw do
get "users/new"
match '/signup', :to => 'users#new'
match '/contact', :to => 'pages#contact'
match '/about', :to => 'pages#about'
match '/help', :to => 'pages#help'
root :to => 'pages#home'
Примечание автора относительно использования - get: show,: id => @user вместо использования - get: show,: id => @ user.id:
"Во-вторых, обратите внимание, что значением хеш-ключа: id вместо атрибута id пользователя @ user.id является сам объект пользователя:
get: show,: id => @user
Мы могли бы использовать код:
get: show,: id => @ user.id
чтобы выполнить то же самое, но в этом контексте Rails автоматически преобразует объект пользователя в соответствующий идентификатор. Это делается путем вызова метода to_param для переменной @user.