【问题标题】:No route matches [POST] "/sessions/user"没有路线匹配 [POST] "/sessions/user"
【发布时间】:2013-08-22 22:49:39
【问题描述】:

我刚刚在我的应用程序上安装了 Devise,我以前像 Michael Hartl 教程一样从头开始。

目前我可以注册和注销。但是当我登录时它给出了一个错误:

No route matches [POST] "/sessions/user"

当我在有或没有(正确)密码的情况下单击登录/登录按钮时会发生这种情况。

我的路线文件是:

SampleApp::Application.routes.draw do
devise_for :users, path_names: { sign_in: "login", sign_out: "logout"}

resources :users do
  resources :bookings, only: [:show]
  end
resources :bookings
resources :sessions

# match '/signup',  to: 'devise/registrations#new', via: :get
# match '/signin',  to: 'devise/sessions#new', via: [:post, :get]
# match '/signout', to: 'devise/sessions#destroy', via: :delete
match '/admin',   to: 'admin#new', via:  :get
match "bookings/new", to: 'bookings#new', via: [:post, :get]

devise_scope :user do 
  root to: 'static_pages#home'
end

[编辑]

我的表单是 devise 的默认表单:

<h2>Sign in</h2>

<%= form_for(resource, :as => resource_name, :url => session_path(resource_name)) do |f| %>
  <div><%= f.label :email %><br />
  <%= f.email_field :email, :autofocus => true %></div>
  <div><%= f.label :password %><br />
  <%= f.password_field :password %></div>
  <% if devise_mapping.rememberable? -%>
    <div><%= f.check_box :remember_me %>
    <%= f.label :remember_me %></div>
  <% end -%>
  <div><%= f.submit "Sign in" %></div>
<% end %>

目前我在 Session Controller 和 Helper 上没有任何代码,例如 Michael Hartl 教程中的代码

我关于 Sessions 的 rake 路线如下:

            sessions GET      /sessions(.:format)                    sessions#index
                     POST     /sessions(.:format)                    sessions#create
         new_session GET      /sessions/new(.:format)                sessions#new
        edit_session GET      /sessions/:id/edit(.:format)           sessions#edit
             session GET      /sessions/:id(.:format)                sessions#show
                     PATCH    /sessions/:id(.:format)                sessions#update
                     PUT      /sessions/:id(.:format)                sessions#update
                     DELETE   /sessions/:id(.:format)                sessions#destroy

[已解决]

我更新了路由文件

  devise_scope :user do 
    root to: 'static_pages#home'
    match '/sessions/user', to: 'devise/sessions#create', via: :post
  end

【问题讨论】:

  • 我可以看看你的表单和对应的控制器方法吗?
  • 我刚刚编辑了文件以包含表单,但它是设计的默认表单。我的会话控制器目前没有任何代码
  • @TiagoOrnelasVieira 很高兴您能够解决您的问题。如果您可以接受给您答案的解决方案,或者提交您自己找到的答案并给它检查,这将有助于那些查看您的问题的人。如果您真的不知道如何解释您的解决方案为何有效,请询问我们,也许有人会解释您的解决方案为何解决了您的问题。一旦你或某人完全回答了这个问题,请给它打勾,这样它就会被关闭,这样 Stack Overflow 就会保持整洁和简洁。谢谢。

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


【解决方案1】:

在路由文件中添加以下行

post ':controller(/:action(/:id(.:format)))'
get ':controller(/:action(/:id(.:format)))'

同时删除 match ':controller(/:action(/:id(.:format)))' -> 导致后续版本冲突

【讨论】:

  • 这可能已经解决了问题,但你能解释一下它到底是什么。我认为它与 match 做同样的事情。我知道在 Rails 4.0.0+ 中,如果没有 via: [:get, :post]via: :allvia: ,则不能使用 match,除此之外,我不明白这有什么帮助。它也在为每个控制器执行此操作,对吗?那么这会在以后引起问题吗?
  • 我真的不知道为什么 match 对我不起作用,但是当我在路由文件中分别用 get 和 post 定义替换它时,它似乎起作用了。这可能不是确切的解决方案,它可能会在以后引起问题(我没有遇到过),但是如果您在弹出 rake 路由冲突页面时手动编写路由定义,它会有所帮助。
【解决方案2】:

我想出的一个可能的解决方案是:

 devise_scope :user do 
    root to: 'static_pages#home'
    match '/sessions/user', to: 'devise/sessions#create', via: :post
  end

【讨论】:

  • 我花了很长时间试图解决与这个问题相同的问题。这个解决方案使我不必将一个名为“会话”的现有模型重命名为其他名称,这似乎是正确修复它的唯一方法......谢天谢地它不是。
【解决方案3】:

sessions/new 视图中,检查登录按钮中包含的链接。您可能有 user 而不是 :user 或类似的错字导致错误的路径。还要检查$ rake routes 的输出 - 登录按钮是否指向存在的路径?你有没有在routes.rb 中创建了一些命名路由?

在 Hartl 教程中,如果您遵循默认设置,那么当您登录时,它应该会引导您从

sessions#newusers#showuser_path

【讨论】:

  • 我修好了。我将会话/用户路由与 devise/sessions#create via post 匹配
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-31
相关资源
最近更新 更多