没有路线匹配 [PATCH] "/users/sign_in" Devise Sign_In
No route matches [PATCH] "/users/sign_in" Devise Sign_In
我在尝试使用设计登录我的 rails 应用程序时一直收到此错误:
No route matches [PATCH] "/users/sign_in"
我这辈子都弄不明白为什么登录无法使用该设备 gem。我的路线如下:
Prefix Verb URI Pattern Controller#Action
root GET / static_pages#home
new_user_session GET /users/sign_in(.:format) devise/sessions#new
user_session POST /users/sign_in(.:format) devise/sessions#create
destroy_user_session DELETE /users/sign_out(.:format) devise/sessions#destroy
user_password POST /users/password(.:format) devise/passwords#create
new_user_password GET /users/password/new(.:format) devise/passwords#new
edit_user_password GET /users/password/edit(.:format) devise/passwords#edit
PATCH /users/password(.:format) devise/passwords#update
PUT /users/password(.:format) devise/passwords#update
cancel_user_registration GET /users/cancel(.:format) devise/registrations#cancel
user_registration POST /users(.:format) devise/registrations#create
new_user_registration GET /users/sign_up(.:format) devise/registrations#new
edit_user_registration GET /users/edit(.:format) devise/registrations#edit
PATCH /users(.:format) devise/registrations#update
PUT /users(.:format) devise/registrations#update
DELETE /users(.:format) devise/registrations#destroy
home GET /home(.:format) static_pages#home
about GET /about(.:format) static_pages#about
lessons GET /lessons(.:format) lessons#index
POST /lessons(.:format) lessons#create
new_lesson GET /lessons/new(.:format) lessons#new
edit_lesson GET /lessons/:id/edit(.:format) lessons#edit
lesson GET /lessons/:id(.:format) lessons#show
PATCH /lessons/:id(.:format) lessons#update
PUT /lessons/:id(.:format) lessons#update
DELETE /lessons/:id(.:format) lessons#destroy
我看到 PATCH /users/sign_in 不是路由,但我不明白为什么它不是由 devise_for :users 创建的?我的印象是这样的调用会生成所有必要的基本身份验证路由。
编辑 1:
/app/views/devise/sessions/new.html.erb
<h2>Log in</h2>
<%= form_for(resource, as: resource_name, url: session_path(resource_name)) do |f| %>
<div class="field">
<%= f.label :email %><br />
<%= f.email_field :email, autofocus: true %>
</div>
<div class="field">
<%= f.label :password %><br />
<%= f.password_field :password, autocomplete: "off" %>
</div>
<% if devise_mapping.rememberable? -%>
<div class="field">
<%= f.check_box :remember_me %>
<%= f.label :remember_me %>
</div>
<% end -%>
<div class="actions">
<%= f.submit "Log in" %>
</div>
<% end %>
<%= render "devise/shared/links" %>
为什么不能 POST 创建一个新会话?如您的路线所示:
user_session POST /users/sign_in(.:format) devise/sessions#create
我们遇到了完全相同的问题。到目前为止,我找到的最佳解决方案是为这样的补丁请求创建路由:
as :account do
patch '/accounts/sign_in', to: 'accounts/sessions#create'
end
请注意,我们的 resource_name 是帐户,我们继承了 rails 的会话控制器,因此控制器 'accounts/sessions'。
编辑: 更好的解决方案是更改您的表单以始终创建一个新会话,如下所示:
原代码来自devise tutorial to customize the sign in view:
<%= form_for(:user, :url => session_path(:user)) do |f| %>
将其更改为新操作并使用 post 请求:
<%= form_for(:user, :url => new_session_path(:user), :method => :post) do |f| %>
我在尝试使用设计登录我的 rails 应用程序时一直收到此错误:
No route matches [PATCH] "/users/sign_in"
我这辈子都弄不明白为什么登录无法使用该设备 gem。我的路线如下:
Prefix Verb URI Pattern Controller#Action
root GET / static_pages#home
new_user_session GET /users/sign_in(.:format) devise/sessions#new
user_session POST /users/sign_in(.:format) devise/sessions#create
destroy_user_session DELETE /users/sign_out(.:format) devise/sessions#destroy
user_password POST /users/password(.:format) devise/passwords#create
new_user_password GET /users/password/new(.:format) devise/passwords#new
edit_user_password GET /users/password/edit(.:format) devise/passwords#edit
PATCH /users/password(.:format) devise/passwords#update
PUT /users/password(.:format) devise/passwords#update
cancel_user_registration GET /users/cancel(.:format) devise/registrations#cancel
user_registration POST /users(.:format) devise/registrations#create
new_user_registration GET /users/sign_up(.:format) devise/registrations#new
edit_user_registration GET /users/edit(.:format) devise/registrations#edit
PATCH /users(.:format) devise/registrations#update
PUT /users(.:format) devise/registrations#update
DELETE /users(.:format) devise/registrations#destroy
home GET /home(.:format) static_pages#home
about GET /about(.:format) static_pages#about
lessons GET /lessons(.:format) lessons#index
POST /lessons(.:format) lessons#create
new_lesson GET /lessons/new(.:format) lessons#new
edit_lesson GET /lessons/:id/edit(.:format) lessons#edit
lesson GET /lessons/:id(.:format) lessons#show
PATCH /lessons/:id(.:format) lessons#update
PUT /lessons/:id(.:format) lessons#update
DELETE /lessons/:id(.:format) lessons#destroy
我看到 PATCH /users/sign_in 不是路由,但我不明白为什么它不是由 devise_for :users 创建的?我的印象是这样的调用会生成所有必要的基本身份验证路由。
编辑 1:
/app/views/devise/sessions/new.html.erb
<h2>Log in</h2>
<%= form_for(resource, as: resource_name, url: session_path(resource_name)) do |f| %>
<div class="field">
<%= f.label :email %><br />
<%= f.email_field :email, autofocus: true %>
</div>
<div class="field">
<%= f.label :password %><br />
<%= f.password_field :password, autocomplete: "off" %>
</div>
<% if devise_mapping.rememberable? -%>
<div class="field">
<%= f.check_box :remember_me %>
<%= f.label :remember_me %>
</div>
<% end -%>
<div class="actions">
<%= f.submit "Log in" %>
</div>
<% end %>
<%= render "devise/shared/links" %>
为什么不能 POST 创建一个新会话?如您的路线所示:
user_session POST /users/sign_in(.:format) devise/sessions#create
我们遇到了完全相同的问题。到目前为止,我找到的最佳解决方案是为这样的补丁请求创建路由:
as :account do
patch '/accounts/sign_in', to: 'accounts/sessions#create'
end
请注意,我们的 resource_name 是帐户,我们继承了 rails 的会话控制器,因此控制器 'accounts/sessions'。
编辑: 更好的解决方案是更改您的表单以始终创建一个新会话,如下所示:
原代码来自devise tutorial to customize the sign in view:
<%= form_for(:user, :url => session_path(:user)) do |f| %>
将其更改为新操作并使用 post 请求:
<%= form_for(:user, :url => new_session_path(:user), :method => :post) do |f| %>