路由会话#destroy action

我正在链接到Sessions控制器的destroy动作,如下所示:

 

routes.rb中:

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

Rails抱怨上面的链接:

没有路由匹配{:action =>“destroy”,:controller =>“sessions”}缺少必需的密钥:[:id]

当没有对象ID提供链接时,如何链接到destroy操作并在Rails中保留REST /资源方法?

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

的routes.rb

 resource :sessions 

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

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

DELETE / sessions sessions#destroy

destroy是一个成员路由,你需要在params中传递id以使其工作,但你可以这样做将它转换为一个收集路由

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

希望有所帮助!

默认情况下,destroy方法需要id,应该通过链接传递。 对于Ex。 你正在销毁登录用户的会话,然后你必须传递登录用户的idsession ,在这种情况下,你的链接应该像这样, <%= link_to "Sign out", session_path(user.id), method: :delete %>或者如果你的目的只是删除/清除会话,那么你需要改变路线。

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

如果你想要两种类型的链接(我们可以在其中传递ID),那么你应该试试这条路线。 delete '/session(/:id)', to: 'sessions#destroy'

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

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

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

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

看看设计的会话破坏行为和路线。

所以,你可以使用类似的东西

  resource :session do delete :destroy, path: 'sign_out', as: "destroy" end 

这将创建指向sessions#destroy path /session/sign_out ,您可以在视图中将其作为destroy_session_path