会话路由#destroy 动作

Routing for sessions#destroy action

我正在 link 执行会话控制器的销毁操作,如下所示:

<%= link_to "Sign out", session_path, method: :delete  %>

Routes.rb:

resources :sessions, only: [:new, :create, :destroy]

Rails抱怨上面的link:

No route matches {:action=>"destroy", :controller=>"sessions"} missing required keys: [:id]

当没有为 link 提供的对象 ID 时,我如何 link 执行销毁操作并在 Rails 中保留 REST/resource 方法?

您需要将会话资源传递给该路由,如下所示:

<%= link_to "Sign out", session_path(session), method: :delete  %>

Rails 显示和删除操作需要资源。

destroy是成员路由,需要在params中传入id才能生效,但是可以这样转换为集合路由

resources :sessions, only: [:new, :create] do
  delete :destroy, on: :collection
end

希望对您有所帮助!

默认情况下销毁方法需要 id,它应该与 link 一起传递。 对于前。您正在为登录用户销毁 session,那么您必须传递 logged-in 用户的 idsession, 在这种情况下,您的 link 应该是这样的, <%= link_to "Sign out", session_path(user.id), method: :delete %> 或者 如果你的目的只是 delete/clear session 那么你需要改变路线。

resources :sessions, only: [:new, :create]
delete '/session', to: 'sessions#destroy'

如果你想要两种类型的 link(我们可能会传递或不传递 ID),那么你应该尝试这条路线。 delete '/session(/:id)', to: 'sessions#destroy'

最好将通往会话控制器的路由视为单一资源

routes.rb

resource :sessions

文档:http://guides.rubyonrails.org/routing.html#singular-resources

这将为您提供无需 ID 即可使用的路线

删除/会话会话#destroy

您需要更改路径,在您的情况下可以是 /users/sign_outsessions/sign_out 而不是 /sessions 使用 DELETE 方法。

看看设计的session destroy动作和路线。

所以,你可以使用像

这样的东西
    resource :session do
      delete :destroy, path: 'sign_out', as: "destroy"
    end

这将创建指向 sessions#destroy 的路径 /session/sign_out,您可以在视图中将其称为 destroy_session_path