名为route的Rails无法识别

我已经开始研究着名的Rails教程的第8章了 。 我想我密切关注说明并定义了以下路线:

SampleApp::Application.routes.draw do resources :users resources :sessions, only: [:new, :create, :destroy] root 'static_pages#home' match '/signup', to: 'users#new', via: 'get' match '/signin', to: 'sessions#new', via: 'get' match '/signout', to: 'sessions#destroy', via: 'delete' match '/help', to: 'static_pages#help', via: 'get' match '/about', to: 'static_pages#about', via: 'get' match '/contact', to: 'static_pages#contact', via: 'get' 

会话控制器(/controllers/sessions_controller.rb)定义如下:

 class SessionsController < ApplicationController def new end def create end def destroy end end 

在spec / requests / authentication_pages_spec.rb中,我创建了以下测试:

 require 'spec_helper' describe "Authentication" do subject {page} describe "signin page" do before { visit signin_path} it { should have_content('Sign in')} it { should have_title('Sign in')} end end 

该测试导致以下错误:

 Failures: 1) Authentication signin page Failure/Error: before { visit signin_path} NameError: undefined local variable or method `signin_path' for #  # ./spec/requests/authentication_pages_spec.rb:7:in `block (3 levels) in ' 2) Authentication signin page Failure/Error: before { visit signin_path} NameError: undefined local variable or method `signin_path' for #  # ./spec/requests/authentication_pages_spec.rb:7:in `block (3 levels) in ' 

即使在routes.rb中定义了signin_path命名路由,它也似乎无法识别。 我用其他一个(signup_path)替换了那个命名路由,问题就消失了。 所以,它是关于这个特定命名路线的东西。 你能说出问题所在吗?

rake路由产生以下输出:

 sb7904313:sample_app nnikolo$ rake routes Prefix Verb URI Pattern Controller#Action users GET /users(.:format) users#index POST /users(.:format) users#create new_user GET /users/new(.:format) users#new edit_user GET /users/:id/edit(.:format) users#edit user GET /users/:id(.:format) users#show PATCH /users/:id(.:format) users#update PUT /users/:id(.:format) users#update DELETE /users/:id(.:format) users#destroy sessions POST /sessions(.:format) sessions#create new_session GET /sessions/new(.:format) sessions#new session DELETE /sessions/:id(.:format) sessions#destroy root GET / static_pages#home signup GET /signup(.:format) users#new signin GET /signin(.:format) sessions#new signout DELETE /signout(.:format) sessions#destroy help GET /help(.:format) static_pages#help about GET /about(.:format) static_pages#about contact GET /contact(.:format) static_pages#contact 

我也重新启动了服务器,它没有解决问题(我做了一个相反的post,但我错了)。

试试这个。 您可以通过命令rake routes访问路由名称。 由于它来自会话控制器,因此默认路由可能类似于new_session_path 。 要更改它,您需要使用as: new_name指定要在路由中更改内容的内容

 match '/signin', to: 'sessions#new', via: 'get', as: 'signin' 

尝试: –

 get "signin" => "sessions#new", :as => "signin" resources :sessions 

将路径用作new_session_pathsignin_path

在rails中使用RSpec和Capybara时,请参阅此线程: 未定义的方法`visit’

您可能没有在您的spec_helper.rb config.include Capybara:DSL以及spec_helper.rb的最新更改而将测试置于rspec/features/中。

重新开始解决问题我错了所以撤回这篇文章。

==编辑我发现了rspec的这种不稳定行为的罪魁祸首:rails似乎没有清空测试之间的缓存(在我看来,这是一个可怕的bug)。 默认情况下,它无法重新读取文件,因此可能会忽略已发生的更改。 我在这里提供了更多细节:Rails教程: Rails教程:未定义的方法