Devise gem已引入但Rails服务器报NoMethodError错误求助
Rails Devise配置NoMethodError问题解决
问题情况
我是Rails新手,在做Instagram克隆项目时引入devise gem,给导航栏添加了「注册」「登录」「退出」「编辑资料」链接后,服务器抛出NoMethodError错误,提示undefined method 'devise_scope'。虽然对照rails routes配置了链接路径,但问题仍未解决。
导航栏链接代码
<li class= "nav-item"> <%= link_to "Sign Up", new_user_registration_path, class: "nav-link"%> </li> <li class= "nav-item"> <%= link_to "Sign In", new_user_session_path, class: "nav-link"%> </li> <li class= "nav-item"> <%= link_to "Sign Out", destroy_user_session_path, class: "nav-link"%> </li> <li class= "nav-item"> <%= link_to "Edit Profile", edit_user_registration_path, method: :delete, class: "nav-link"%> </li>
routes.rb配置
Rails.application.routes.draw do devise_scope :user do get '/users', to: 'devise/registrations#new' get '/users/password', to: 'devise/passwords#new' get '/users/sign_out' => 'devise/sessions#destroy' end devise_for :users get 'posts/new' get 'home/about' resources :posts get "up" => "rails/health#show", as: :rails_health_check root "posts#index" end
错误信息
NoMethodError undefined method `devise_scope' for #<ActionDispatch::Routing::Mapper:0x00007fe912a6e430 @set=#<ActionDispatch::Routing::RouteSet:0x00007fe921d90f00>, @draw_paths=[#Pathname:/Users/dessy/.rvm/gems/ruby-3.0.0/gems/actionview-7.1.3.4/config/routes, #Pathname:/Users/dessy/.rvm/gems/ruby-3.0.0/gems/activestorage-7.1.3.4/config/routes, #Pathname:/Users/dessy/.rvm/gems/ruby-3.0.0/gems/actioncable-7.1.3.4/config/routes, #Pathname:/Users/dessy/.rvm/gems/ruby-3.0.0/gems/actionmailbox-7.1.3.4/config/routes, #Pathname:/Users/dessy/.rvm/gems/ruby-3.0.0/gems/actiontext-7.1.3.4/config/routes, #Pathname:/Users/dessy/.rvm/gems/ruby-3.0.0/gems/importmap-rails-2.0.1/config/routes, #Pathname:/Users/dessy/.rvm/gems/ruby-3.0.0/gems/turbo-rails-2.0.6/config/routes, #Pathname:/Users/dessy/.rvm/gems/ruby-3.0.0/gems/stimulus-rails-1.3.3/config/routes, #Pathname:/Users/dessy/Desktop/Ruby/PROJECTS/Odin-insta/config/routes, #Pathname:/Users/dessy/Desktop/Ruby/PROJECTS/Odin-insta/config/routes], @scope=#<ActionDispatch::Routing::Mapper::Scope:0x00007fe912a6e3e0 @hash={:path_names=>{:new=>"new", :edit=>"edit"}}, @parent=#<ActionDispatch::Routing::Mapper::Scope:0x00007fe92491c048 @hash=nil, @parent=nil, @scope_level=nil>, @scope_level=nil>, @concerns={}>
问题原因及修正方案
1. 解决devise_scope未定义错误
devise_scope是Devise提供的路由方法,必须在devise_for :users之后调用——因为devise_for会加载Devise的路由扩展模块,提前调用devise_scope时Rails还未识别该方法,导致报错。同时退出请求需使用DELETE方法,而非GET。
修正后的routes.rb:
Rails.application.routes.draw do # 先加载devise_for,再使用devise_scope devise_for :users devise_scope :user do get '/users', to: 'devise/registrations#new' get '/users/password', to: 'devise/passwords#new' # 修正退出请求的方法为DELETE delete '/users/sign_out', to: 'devise/sessions#destroy' end get 'posts/new' get 'home/about' resources :posts get "up" => "rails/health#show", as: :rails_health_check root "posts#index" end
2. 修正导航栏链接的请求方法错误
- 退出链接:Devise默认的退出路由是DELETE请求,原代码未指定
method: :delete会导致路由匹配失败,需添加该参数。 - 编辑资料链接:原代码错误添加了
method: :delete,编辑页面是GET请求,需移除该参数。
修正后的导航栏代码:
<li class="nav-item"> <%= link_to "注册", new_user_registration_path, class: "nav-link"%> </li> <li class="nav-item"> <%= link_to "登录", new_user_session_path, class: "nav-link"%> </li> <li class="nav-item"> <%= link_to "退出", destroy_user_session_path, method: :delete, class: "nav-link"%> </li> <li class="nav-item"> <%= link_to "编辑资料", edit_user_registration_path, class: "nav-link"%> </li>
验证方法
运行rails routes命令,查看生成的路由列表,确认destroy_user_session对应的请求方法是DELETE,edit_user_registration对应的是GET。
内容的提问来源于stack exchange,提问作者Dessy
相关产品推荐
相关产品推荐

