Rails 3教程第7.3.1节路由错误

时间:2011-06-21 01:50:50

标签: ruby-on-rails

在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方法来实现。

2 个答案:

答案 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