无法退出清关宝石

时间:2016-08-26 10:42:01

标签: ruby-on-rails routes clearance

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

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

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')

2 个答案:

答案 0 :(得分:0)

该消息告诉您get没有sign_out路由,这是正确的。你必须做delete。这意味着,尽管您努力使用method: :delete,但该链接正在执行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帮助程序的块形式有关,而与清除无关。

答案 1 :(得分:0)

我认为我会对这一点采取更多的见解,对于那些发现自己仍然想知道这背后究竟是什么的人来说。

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

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

为什么我不能只使用link_to

对此进行了更多深入了解by this previous SO。基本上,您不能将链接作为 DELETE 方法运行,只能 GET

如果你看一下link_to如何在页面上用HTML实际呈现(在Ruby发挥其魔力之后),你会看到以下内容:

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

很明显data-method="delete"仍然不会削减它,仍然以 GET 的形式运行请求。

但我不想要一个按钮,我想要一个链接?

最好的办法是在元素上查看一些CSS,使其恢复为链接状态,否则,您需要使用Javascript路径。

非RESTFUL Clearance Centric Dirty Hack - 不建议!

使用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确实支持这个肮脏的黑客)