Я работаю через тот же учебник, и у меня та же проблема.Мой анализ заключается в том, что проблема в том, что мы используем redirect_back_or root_path
в контроллере микросообщений (~ / rails_projects / sample_app / app / controllers / microposts_controller.rb):
class MicropostsController < ApplicationController
...
before_filter :correct_user, only: :destroy
...
def destroy
@micropost.destroy
logger.debug "in MicropostsController.destroy:"
logger.debug " root_path=#{root_path}"
logger.debug " session[:return_to]=#{session[:return_to]}"
redirect_back_or root_path
end
Вывод из logger.debugпоказанные операторы:
in MicropostsController.destroy:
root_path=/
session[:return_to]=/microposts/28
Напомним, что redirect_back_or определен в session_helper.rb как:
def redirect_back_or(default)
redirect_to(session[:return_to] || default)
clear_return_to
end
Таким образом, вызов redirect_back_or root_path
приведет к:
redirect_to(/microposts/28)
Я новичок здесь, но я думаю, что действием по умолчанию является GET;по крайней мере, это согласуется с тем, что я вижу, то есть именно поэтому мы публикуем GET в /microposts/28.
Между тем, в routs.rb мы определили микросообщения ресурсов, которые поддерживают только createи уничтожить действия:
resources :microposts, only: [:create, :destroy]
Конечно, мы не хотим получать микросообщение, которое мы только что удалили;мы хотим перерисовать (или перенаправить?) обратно на страницу, с которой мы пришли.В качестве доказательства того, что этот анализ является правильным, я обнаружил, что вызов redirect_to root_path
вместо redirect_back_or root_path
«работает», когда микросообщение удаляется (после всплывающего подтверждения) и возвращает пользователя на домашнюю страницу.(показывает, что удаленный микросообщение пропало).
Теперь я изменил свой, чтобы снова появилась страница, с которой было вызвано действие удаления:
def destroy
@micropost.destroy
redirect_to request.referer
end
Я также изменилмое определение SessionsHelper#store_location
:
def store_location
session[:return_to] = request.fullpath if ['show', 'edit'].include?action_name
end
Итак, только действия «show» и «edit» пытаются возобновить после входа в систему.