2013-08-19 2 views
0

Блок respond_to не перенаправляет обратно в представление '/ dashboard' (url остается в 'gcal_user.19') и приводит к ошибке «406 Not Acceptable», когда я нажимаю на ссылке удаления в представлении панели. Пробовал отладки, поиск в Google, переполнение стека, но все усилия были бесплодны.Respond_to не перенаправляет, дает 406 Неприемлемая ошибка

Использование Rails 3.2.13, Ruby 1.9.3
Приложение включает в JQuery и jquery_ujs (ненавязчивый JS) в application.js

Dashboard View (Haml):

%div.control-group.controls 
    = link_to "Delete Gcal User", @gcal_user, method: :delete 

GcalUser контроллер:

def destroy 
    @gcal_user = current_user.gcal_user 

    # -- commented out for debugging -- 
    # if @gcal_user.delete 
    # flash[:notice] = "#{@gcal_user.username} deleted" 
    # end 

    respond_to do |format| 
     format.html { redirect_to user_root_path } 
    end 
    end 

конфигурации/routes.rb

get "home/index" 
    root :to => 'home#index' #, as: '/' 
    devise_for :users 
    resource :gcal_user 
    match "dashboard" => 'home#dashboard', as: :user_root 

Маршрут:

DELETE /gcal_user(.:format)    gcal_users#destroy 

При нажатии на ссылку Удалить правильно достигает метода destroy. Проблема возникает с блоком respond_to.

Другие образцы кода, похоже, работают ... Я не могу понять, что мне не хватает. Есть идеи?

Во-вторых, ошибка 406 из-за несоответствия типа запроса, я считаю, как проверить тип генерируемого запроса и ответа? Если есть несоответствие, где в коде я смогу изменить тип запроса?

+0

, в котором задан маршрут u, link_to «Удалить пользователя Gcal» или user_root_path. Проверьте, идет ли запрос уничтожить действие после нажатия ссылки «Удалить Gcal User»? –

+0

Просьба к действию уничтожить, как ожидалось. Я сузил проблему до блока 'response_to' и' format.html {redirect_to user_root_path} '. – HM1

+0

имеют u проверенный маршрут user_root. Вам не нужно передавать идентификатор объекта пользователя с этим маршрутом. –

ответ

2

Как вы сказали в ответ Билли Чан, расположенный по адресу «/ gcal_user.19 ", поэтому это означает, что контроллер пытается ответить на формат с типом« 19 ». Попробуйте переопределить свои маршруты как resources :gcal_user, и вы можете пройти only: :destroy, если хотите удалить ненужные маршруты. Я бы ответил как комментарий, но У меня нет необходимой репутации, чтобы сделать это.

+0

Это сработало. Спасибо, что объяснили это. Просто наличие исключительного и множественного ресурса вызвало столько горя! Должен ли я всегда использовать множественные ресурсы для маршрутов? – HM1

+1

Разница между сингулярным и множественным числом очень хорошо объясняется в [руководстве по направляющим] (http://guides.rubyonrails.org/routing.html#crud-verbs-and-actions). В принципе, множественное число ожидает, что вы будете создавать несколько ресурсов одного типа, а сингулярный ожидает, что только один ресурс этого типа будет создан. В большинстве случаев вы будете использовать множественную форму, но особая форма также полезна в некоторых случаях. – jvperrin

+0

Я не думаю, что его хорошо объяснили в руководствах. Я интерпретировал это объяснение как способ маскировать маршрут «/ profile /: id» для «/ profile» для текущего пользователя, но не означает, что в приложении только один пользователь. Затем он дает пример геокодера, но не поясняет, что он будет только одним геокодером, когда-либо похожим на то, как вы его сформулировали. Спасибо, что прояснил это, действительно оцените его. – HM1

2

Ошибка «406» представляет из-за отсутствия правильного формата для ответа.

У вас нет правильного формата для ответа, потому что в результате действия вашего контроллера возникает ошибка, а ошибка не имеет формата.

Почему ошибка? Вы потеряли метод delete.

Почему не удалось? У вас нет идентификатора, присвоенного объекту.

Почему нет идентификатора? Вы не определили его на своих маршрутах.

Посмотрите ваши маршруты. Неправильно

DELETE /gcal_user(.:format)    gcal_users#destroy 

Нет идентификатора. Правильные вещи должны быть

DELETE /gcal_user/:id(.:format)    gcal_users#destroy 

Попробуйте проверить и переопределить маршруты.

+0

Я считаю, что маршруты такие, потому что я использовал 'resource: gcal_user' вместо' resources: gcal_user'. Возможно, я ошибаюсь, но я не думаю, что это проблема, потому что URL-адрес содержит идентификатор i.e. "/gcal_user.19", где 19 - ': id'. Verified 'params [: id] = 19' тоже. Что-нибудь еще? – HM1

0

URL-адрес не вызывается с помощью метода DELETE, и, следовательно, он не вызывается. То, что называется, уничтожает пользователи с помощью метода GET, и он дает ошибку 406. Возможные причины и их решение приведены в работе Intrepidd.

Попробуйте что-то вроде этого: -

devise_scope: пользователь может делать корень: в => 'дома # приборной панели' конца

+0

Я знаю, что URL-адрес не вызывается с помощью метода DELETE ... unobtrusive js преобразует его. Я подтвердил, как указано выше, вызывается метод 'destroy' и выполняется код в нем. Проблема возникает в блоке 'response_to'. Я не вижу ответа Интрепидта! – HM1

+0

Сбросьте конфигурацию/routes.rb здесь. – techvineet

+0

Я добавил файл route.rb выше в вопросе, чтобы другие могли его увидеть. – HM1