在Michael Hartl的Rails教程的第7.3.1节中运行rspec spec / controllers / users_controller_spec.rb时出现以下错误:
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
知道造成路由错误的原因是什么?
这是我的routes.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 =&gt; @user而不是使用 - get:show,:id =&gt; @ user.id:
“其次,请注意,散列键的值:id,而不是用户的id属性@ user.id,是用户对象本身: get:show,:id =&gt; @user
我们可以使用代码: get:show,:id =&gt; @用户身份 为了完成同样的事情,但在这种情况下,Rails会自动将用户对象转换为相应的id。它通过在@user变量上调用to_param方法来实现。
答案 0 :(得分:0)
我相信你的代码告诉Rails id 是用户,这当然没有意义。这就是创建像/ users / @ user这样的路径,没有路由存在。您可能知道,您需要像/ users / 1这样的路径。
所以我觉得你的代码看起来像
get :show, :id => @user.id
或可能
get :show, @user
答案 1 :(得分:0)
您缺少用户的show动作路线。您可以在routes.rb文件中添加类似的内容。
match "/users/:id" => "users#show"
如果你想要正常的CRUD动作,你可以摆脱你的用户/新路线而不是上面的匹配线,只需用一行声明它们:
resources :users