0

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

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

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

2 回答 2

0

该消息告诉您没有get路由sign_out,这是正确的。你必须做一个delete. 这意味着,尽管您努力使用method: :delete,该链接仍在执行get请求。你的有些东西link_to是不正确的。它可能与method使用 link_to 的块形式时传递有关。

尝试:

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

如果可行,请尝试:

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

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

于 2016-08-26T15:53:01.643 回答
0

我想我会跟进这一点,为那些发现自己仍然想知道这背后究竟是什么的人提供更多见解。

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

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

为什么我不能直接使用link_to

因此,先前的 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请求路由到destroyClerance 控制器上的操作。我敢说这是不建议的,Derek 可以支持为什么一开始就不支持(Devise gem 确实支持这种肮脏的黑客攻击)

于 2016-11-23T21:23:47.030 回答