2013-09-02 2 views
0

Если «Я набираю URL-адрес в браузере, я получаю ошибку маршрутизации, но если я нажимаю ссылку на этот URL-адрес, он работает. Почему так?Ruby on Rails: Ошибка маршрутизации ТОЛЬКО при вводе в браузер, но работает при нажатии на ссылку?

devise_for :user, :skip => [:registrations, :sessions] do 
    get 'signup' => 'devise/registrations#new', :as => :new_user_registration 
    post 'signup/:invitation_token' => 'devise/registrations#create', :as => :user_registration 
    get 'signin' => 'devise/sessions#new', :as => :new_user_session 
    post 'signin' => 'devise/sessions#create', :as => :user_session 
    delete 'signout' => 'devise/sessions#destroy', :as => :destroy_user_session 
    end 

Например, если я нахожу localhost: 3000/signout в браузере, я получу ошибку. Но если есть связь

<%= link_to "Logout", destroy_user_session_path, :method => :delete %> 

Будет работать. То же самое происходит с другими настраиваемыми маршрутами.

+0

Когда вы наводите курсор на ссылку «выйти» (или просматриваете источник HTML), какой путь он предоставляет? – lurker

+0

@mbratch i get 'localhost: 3000/signout' – hellomello

+0

Вы нашли решение этого? Был ли какой-либо из нижеприведенных ответов? – zeantsoi

ответ

1

Если вы читали Devise source code, вы увидите, что различные действия контроллера Разрабатывают вызываются различными HTTP Запросы.

Например, новый метод sign_in является GET запрос:

# GET /resource/sign_in 

Но фактическое создание нового сеанса пользователя является POST запрос:

# POST /resource/sign_in 

И метод sign_out является запросом DELETE:

# DELETE /resource/sign_out 

Из этих трех типов запросов (GET, POST и DELETE), только GET запросы могут быть сделаны просто введя URL в браузере - два других типа требуют специальных заголовков HTTP, как правило, устанавливается либо в формах, ссылки, или т.п.

Точный тип запроса, который должен быть сделан для доступа к каждому методу контроллера Devise, доступен в виде встроенной документации в the source code ... Я рекомендую вам посмотреть.

+0

было бы хорошо, если вместо' delete 'signout' => 'devise/sessions # destroy',: as => : destroy_user_session' Я сделаю 'get 'signout' => ...'? – hellomello

+0

__not__ рекомендуется переопределять 'delete' с' get' в этой ситуации. 'devise/sessions # destroy' является действием _destructive_, и поэтому целесообразно запросить его как запрос' delete'. Если вы уничтожаете что-либо - включая данные сеанса - вы должны запрашивать деструктивное действие с помощью 'delete'. – zeantsoi

+0

Помог ли этот вопрос решить ваш вопрос?Если да, можете ли вы любезно согласиться с принятием/голосованием? – zeantsoi

0

Ошибка маршрутизации присутствует, когда вы вручную вводите URL-адрес, потому что веб-браузеры посылают запросы GET по умолчанию. В вашем примере ссылки создается запрос DELETE, согласно :method => :delete. Таким образом, глагол (GET vs DELETE vs PATCH vs POST) должен соответствовать маршруту. Вы можете это объяснить для своего приложения, выполнив rake routes. Вы увидите URL-адреса вместе с типом запроса/глаголом.

Если вы хотите, чтобы сделать подобный запрос DELETE вы можете посмотреть в этом с завитком: http://blogs.plexibus.com/2009/01/15/rest-esting-with-curl/

+0

Да, но я получаю ошибку не только от выхода, но и другие маршруты, такие как регистрация. – hellomello

+0

Можете ли вы показать соответствующий вывод из 'rake routes'? Ответ должен быть там. – pdobb

+0

Это мой дорожный указатель графа 'destroy_user_session DELETE /signout(.:format) devise/sessions # destroy' – hellomello

Смежные вопросы