会话路由#destroy action

时间:2016-06-15 08:45:30

标签: ruby-on-rails rest rails-routing ruby-on-rails-5

我链接到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 /资源方法?

5 个答案:

答案 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。您正在销毁登录用户的会话,然后您必须通过登录用户的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'

答案 3 :(得分:0)

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

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

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

答案 4 :(得分:0)

您需要使用sessions/sign_out方法更改路径,在您的情况下可以是/sessionsDELETE而不是 resource :session do delete :destroy, path: 'sign_out', as: "destroy" end

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

所以,你可以使用像

这样的东西
/session/sign_out

这将创建指向sessions#destroy的路径destroy_session_path,您可以在视图中将其称为{{1}}。