Невозможно выйти из клиренса
Недавно я переместил свой проект из раздувающего устройства в другое, хотя у меня возникают проблемы при попытке выйти из системы.
Я в настоящее время получаю ошибку маршрута не существует
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 ответа
Сообщение говорит вам, что нет 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
помощник и не имеет ничего общего с оформлением.
Я подумала, что последую этому, чтобы узнать кого-то, кто все еще задумывается над тем, что стоит за этим.
Как предполагает Дерек, чтобы отсортировать это, вам нужно использовать 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 Клиренс 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
запрос к destroy
действие на контроллере Clerance. Я смею сказать, что это не рекомендуется, и Дерек может поддержать, почему это не было поддержано во-первых (драгоценный камень Devise действительно поддерживает этот грязный взлом)