我最近将我的项目从有点臃肿的设计转移到清除,尽管我在尝试注销时遇到了麻烦
我目前得到路由不存在的错误
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
进行了操作,但链接正在执行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
助手的块形式的方式,与清除无关。
我想我应该为那些发现自己仍然想知道这背后到底是什么的人提供更多的见解。
根据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清除中心脏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可以支持为什么不支持这个(设计gem确实支持这个肮脏的hack)