Rails 3 Tutorial Раздел 7.3.1 Ошибка маршрутизации - PullRequest
0 голосов
/ 21 июня 2011

Я получаю следующую ошибку при запуске 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.

Ответы [ 2 ]

0 голосов
/ 21 июня 2011

Вы пропустили маршрут к шоу-действию для пользователей. Вы можете добавить что-то вроде этого в файл rout.rb.

match "/users/:id" => "users#show"

Если вы хотите обычные действия CRUD, вы можете избавиться от своих пользователей / нового маршрута и вместо строки соответствия выше, просто объявите их всех одной строкой:

resources :users
0 голосов
/ 21 июня 2011

Я считаю, что ваш код сообщает Rails, что id - это пользователь, что, конечно, не имеет смысла.Это создает путь, такой как / users / @ user, для которого нет маршрута.Как вы, наверное, знаете, вам нужен путь вроде /users/1.

Так что я думаю, что ваш код должен выглядеть так:

get :show, :id => @user.id

или, возможно,

get :show, @user
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...