无法注销权限 gem

Unable to log out of clearance gem

我最近将我的项目从有点臃肿的设计转移到清除,尽管我在尝试注销时遇到了麻烦

我目前收到路线不存在的错误

No route matches [GET] "/sign_out"

路线

resources :passwords, controller: "clearance/passwords", only: [:create, :new]
  resource :session, controller: "clearance/sessions", only: [:create]

  resources :users, controller: "clearance/users", only: [:create] do
    resource :password,
      controller: "clearance/passwords",
      only: [:create, :edit, :update]
  end

  get "/sign_in" => "clearance/sessions#new", as: "sign_in"
  delete "/sign_out" => "clearance/sessions#destroy", as: "sign_out"
  get "/sign_up" => "clearance/users#new", as: "sign_up"

  constraints Clearance::Constraints::SignedIn.new do
    root :to => 'shopping/merchants#index', as: :signed_in_root
  end

  constraints Clearance::Constraints::SignedOut.new do
    root to: 'clearance/sessions#new'
  end

查看

= link_to sign_out_path, method: :delete, class: 'mdl-navigation__link' do
    i.material-icons> exit_to_app
    = t('.log_out')

消息告诉您 sign_out 没有 get 路线,这是正确的。你必须做一个delete。这意味着,尽管您对 method: :delete 做出了努力,但 link 正在执行 get 请求。您的 link_to 有些地方不正确。它可能与在使用 link_to.

的块形式时传递 method 有关

尝试:

<%= button_to "Sign Out", sign_out_path, method: :delete %>

如果可行,请尝试:

<%= link_to "Sign Out", sign_out_path, method: :delete %>

如果这两个都有效,那么问题确实出在您使用 link_to 助手的块形式的方式上,与 Clearance 无关。

我想我会对此进行跟进,为发现自己仍然想知道这背后究竟是什么的任何人提供更多见解。

根据 Derek 的建议,要进行排序,您需要使用 button_to 而不是 link_to,如下所示:

<%= button_to "Sign Out", sign_out_path, method: :delete %>

为什么我不能只使用 link_to

因此提供了更多对此的见解 by this previous SO。本质上,您不能使 link 作为 DELETE 方法运行,只能使 GET.

如果您查看 link_to 在页面上 HTML 中的实际呈现方式(在 Ruby 发挥其魔力之后),您将看到以下内容:

<a rel="nofollow" data-method="delete" href="/sign_out">Sign out</a>

而且很明显data-method="delete"还是不打算砍掉它,仍然以GET.

运行请求

但是我不要按钮,我想要一个link?

你最好的办法是查看元素上的一些 CSS,让它看起来像 link,否则,你需要走 Javascript 路线.

非RESTFUL 清除中心肮脏黑客 - 不建议!

使用 link_to,更改您的 routes.rb 当前清关路线为:

  delete     "/sign_out" => "clearance/sessions#destroy", as: "sign_out"

至:

  get     "/sign_out" => "clearance/sessions#destroy", as: "sign_out"

它将 GET 请求路由到 Clerance 控制器上的 destroy 操作。我敢说这是不建议的,Derek 可以支持为什么首先不支持它(Devise gem 确实支持这种肮脏的 hack)