为什么我的Rails应用程序有时仅在DEV中错误地路由?

时间:2014-03-12 00:34:17

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

有时当我退出时,我收到此错误。它只发生在DEV中。我怀疑它可能与Turbolinks有关,但我不确定。

Started GET "/users/logout" for 127.0.0.1 at 2014-03-11 20:08:31 -0400
Processing by UsersController#show as HTML
  Parameters: {"id"=>"logout"}
  User Load (0.0ms)  SELECT "users".* FROM "users" WHERE "users"."id" = $1 LIMIT 1  [["id", "logout"]]
Completed 404 Not Found in 2ms

ActiveRecord::RecordNotFound (Couldn't find User with id=logout):
  app/controllers/users_controller.rb:11:in `show'

我甚至没有这条路的GET路线。它应该给我一个路线错误。

  resources :users do
    collection do
      get 'login', to: :login
      post 'login', to: :loginCreate 
      post 'logout', to: :logout

rake routes

      logout_users POST   /users/logout(.:format)                                              users#logout

Haml的

  .button=link_to 'Logout', logout_users_path, method: 'post'

重装时问题就消失了。 JS已启用。

Ruby 2.0.0,Rails 4.0.3。

3 个答案:

答案 0 :(得分:1)

我认为很可能是/ users /:id的路由,这就是它输出" logout"作为GET请求时的id参数:

参数:{" id" =>"退出"}

至于为什么你的链接是GET而不是POST,我对HAML并不熟悉。从您的代码示例看起来它试图将链接指定为POST?如果是这样,我之前从未见过锚标记。

答案 1 :(得分:1)

您应该将注销/登录逻辑移动到不同的控制器,即sessions_controller,然后进行会话/登录会话/注销,而不是将这些操作嵌套在用户操作中。

因为你的路由文件与用户/注销匹配,用id = logout来更新用户/:id,这就是你看到错误的原因。

答案 2 :(得分:1)

问题是您是否正在调用resources :users creates the show这样记录:

/users/:id

因为在之前正在创建其他路由,所以Rails会先处理它,因此如果你发送/logout它就会感到困惑。立即修复(使用scope):

#config/routes.rb
scope "/users" do
  get 'login', to: "users#login"
  post 'login', to: "users#loginCreate"
  post 'logout', to: "users#logout"
end
resources :users

我还建议使用Marc在他的回答中提到的SessionsController方法。 Devise&其他身份验证系统使用此