名为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_path或signin_path
在rails中使用RSpec和Capybara时,请参阅此线程: 未定义的方法`visit’
您可能没有在您的spec_helper.rb
config.include Capybara:DSL
以及spec_helper.rb
的最新更改而将测试置于rspec/features/
中。
重新开始解决问题我错了所以撤回这篇文章。
==编辑我发现了rspec的这种不稳定行为的罪魁祸首:rails似乎没有清空测试之间的缓存(在我看来,这是一个可怕的bug)。 默认情况下,它无法重新读取文件,因此可能会忽略已发生的更改。 我在这里提供了更多细节:Rails教程: Rails教程:未定义的方法