我链接到Sessions控制器的销毁操作,如下所示:
<script>
$(document).ready(function()
{
if(typeof(Storage) !== "undefined")
{
if (sessionStorage.pagecount)
{
sessionStorage.pagecount = Number(sessionStorage.pagecount) + 1;
}
else
{
sessionStorage.removeItem('pagecount');
window.location='logout.php';
}
}
else
{
sessionStorage.removeItem('pagecount');
window.location='logout.php';
}
});
</script>
routes.rb中:
<%= link_to "Sign out", session_path, method: :delete %>
Rails抱怨上面的链接:
没有路线匹配{:action =&gt;&#34;销毁&#34;,:控制器=&gt;&#34;会话&#34;}缺少必需的密钥:[:id]
当没有对象ID提供链接时,如何链接到destroy操作并在Rails中保留REST /资源方法?
答案 0 :(得分:6)
最好将会话控制器的路由视为单一资源
的routes.rb
resource :sessions
Doc:http://guides.rubyonrails.org/routing.html#singular-resources
这将为您提供一条无需身份证即可使用的路线
DELETE / sessions sessions#destroy
答案 1 :(得分:4)
destroy
是成员路线,您需要在参数中传递id
才能使其正常工作,但您可以将其转换为收集路线
resources :sessions, only: [:new, :create] do
delete :destroy, on: :collection
end
希望有所帮助!
答案 2 :(得分:1)
默认情况下,destroy方法需要id,应该通过链接传递。
对于Ex。您正在销毁登录用户的会话,然后您必须通过登录用户的id
或session
,
在这种情况下,您的链接应该是这样的,
<%= 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'
答案 3 :(得分:0)
您需要将会话资源传递给该路由,如下所示:
<%= link_to "Sign out", session_path(session), method: :delete %>
Rails显示和删除操作需要资源。
答案 4 :(得分:0)
您需要使用sessions/sign_out
方法更改路径,在您的情况下可以是/sessions
或DELETE
而不是 resource :session do
delete :destroy, path: 'sign_out', as: "destroy"
end
。
看看设计的session destroy行动和路线。
所以,你可以使用像
这样的东西/session/sign_out
这将创建指向sessions#destroy
的路径destroy_session_path
,您可以在视图中将其称为{{1}}。