【问题标题】:No route matches [PATCH] "/users/sign_in" Devise Sign_In没有路线匹配 [PATCH] "/users/sign_in" 设计 Sign_In
【发布时间】:2015-11-21 01:28:49
【问题描述】:

我在尝试使用 devise 登录我的 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" %>

【问题讨论】:

  • 如果将method: :post 显式添加到form_for 会怎样?如果你删除你的模板并使用默认值会发生同样的事情吗?

标签: ruby ruby-on-rails-4 devise cancan


【解决方案1】:

为什么你不能直接发布来创建一个新会话?如您的路线所示:

   user_session POST   /users/sign_in(.:format)       devise/sessions#create

【讨论】:

  • 老实说,我只是在使用为视图提供的设计(默认情况下它设置为补丁?)...我已经修改了该代码以强制发布,但这似乎是破坏其他的东西,比如:current_user。不知道为什么...
  • 不确定,但我建议在这种情况下发布视图代码。以下是登录示例:github.com/RailsApps/rails-devise/blob/master/app/views/devise/…
  • 我刚刚添加了它,但它直接来自 devise 3.5.2 gem.. 我没有进行任何编辑
  • 我唯一的猜测是会话已经存在,所以表单助手将其设为更新 (PATCH) 而不是创建 (POST)。 (在这种情况下,现实世界的应用程序不会向用户显示登录表单。)也许看看它在隐身模式下的工作方式是否不同(应该重置会话)。
【解决方案2】:

我们遇到了完全相同的问题。到目前为止,我发现的最佳解决方案是为补丁请求创建路由,如下所示:

as :account do
  patch '/accounts/sign_in', to: 'accounts/sessions#create'
end

请注意,我们的 resource_name 是 account,我们继承自 rails 的会话控制器,因此控制器是“accounts/sessions”。

编辑:更好的解决方案是更改您的表单以始终创建一个新会话,如下所示:

原代码来自devise tutorial to customize the sign in view

<%= form_for(:user, :url => session_path(:user)) do |f| %>

将其更改为新操作并使用发布请求:

<%= form_for(:user, :url => new_session_path(:user), :method => :post) do |f| %>

【讨论】:

    猜你喜欢
    • 2015-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-15
    • 2015-12-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多