Маршрутизация для сеансов#destroy action

Я связываюсь с действием уничтожения для контроллера сеансов следующим образом:

<%= link_to "Sign out", session_path, method: :delete  %>

Маршруты.рб:

resources :sessions, only: [:new, :create, :destroy]

Rails жалуется на ссылку выше:

Маршрут не соответствует {:action=>"destroy", :controller=>"sessions"}, отсутствуют необходимые ключи: [:id]

Как мне связать действие уничтожения и сохранить методологию REST/resource в Rails, когда нет идентификатора объекта для ссылки?


person Fellow Stranger    schedule 15.06.2016    source источник
comment
Какой префикс вы получаете для сеанса, когда делаете rake routes?   -  person Kumar    schedule 15.06.2016
comment
Тогда вы не должны показывать эту ссылку, когда у вас нет идентификатора объекта   -  person Pravesh Khatri    schedule 15.06.2016
comment
Сеансы не имеют идентификаторов.   -  person Fellow Stranger    schedule 15.06.2016


Ответы (5)



destroy — это маршрут члена, вам нужно передать id в параметрах, чтобы он работал, но вы можете сделать это, чтобы преобразовать его в маршрут коллекции.

resources :sessions, only: [:new, :create] do
  delete :destroy, on: :collection
end

Надеюсь, это поможет!

person Rajdeep Singh    schedule 15.06.2016

По умолчанию метод destroy ожидает id, который нужно передать по ссылке. Для экс. вы уничтожаете сеанс для вошедшего в систему пользователя, тогда вам нужно передать id или session вошедшего в систему пользователя, в этом случае ваша ссылка должна быть такой, <%= link_to "Sign out", session_path(user.id), method: :delete %> или если ваша цель состоит в том, чтобы просто удалить/очистить сеанс, только тогда вам нужно менять маршрут.

resources :sessions, only: [:new, :create]
delete '/session', to: 'sessions#destroy'

Если вам нужны оба типа ссылок (в которых мы можем передавать идентификатор или нет), вам следует попробовать этот маршрут. delete '/session(/:id)', to: 'sessions#destroy'

person Hiren Bhalani    schedule 15.06.2016

Вам нужно передать ресурс сеанса на этот маршрут, например:

<%= link_to "Sign out", session_path(session), method: :delete  %>

Действия показа и удаления Rails требуют ресурса.

person RichardAE    schedule 15.06.2016

Вам нужно изменить путь, который в вашем случае может быть /users/sign_out или sessions/sign_out, а не /sessions методом DELETE.

Взгляните на уничтожение сеанса в devise. Действие и маршрут.

Итак, вы можете использовать что-то вроде

    resource :session do
      delete :destroy, path: 'sign_out', as: "destroy"
    end

Это создаст путь /session/sign_out, который указывает на sessions#destroy, и вы можете назвать его в своих представлениях как destroy_session_path.

person Charizard_    schedule 15.06.2016