我最近将我的项目从有些臃肿的设计转移到了清关,尽管我在尝试注销时遇到了麻烦
我目前收到路线不存在的错误
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')
答案 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确实支持这个肮脏的黑客)