Невозможно выйти из клиренса

Недавно я переместил свой проект из раздувающего устройства в другое, хотя у меня возникают проблемы при попытке выйти из системы.

Я в настоящее время получаю ошибку маршрута не существует

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 действительно поддерживает этот грязный взлом)

Другие вопросы по тегам