Волшебный камень - как использовать метод redirect_or_back_to
Когда незарегистрированный пользователь нажимает кнопку "Мнение Deja Tu" на этой странице:
... пользователь перенаправляется на страницу входа в систему с сообщением "Вы должны войти или зарегистрироваться перед тем, как продолжить". Я сделал это - нет проблем здесь.
Кнопка "Deja Tu Opinion" указывает на новый_testimonial_path. Однако, если они не вошли в систему, они будут перенаправлены на страницу входа. Я достиг этого, написав метод require_login и поместив в контроллер приложения:
class ApplicationController < ActionController::Base
# Prevent CSRF attacks by raising an exception.
# For APIs, you may want to use :null_session instead.
protect_from_forgery with: :exception
private
def require_login
if !logged_in?
redirect_to('/user_sessions/new')
flash[:notice] = "Necesitas entrar o salir antes de continuar"
end
end
end
Затем я объявил об этом в своем контроллере отзывов:
class TestimonialsController < ApplicationController
before_action :set_testimonial, only: [:show, :edit, :update, :destroy]
# before_action :correct_user, only: [:edit, :update, :destroy]
before_action :require_login, except: [:index, :show]
Когда они затем входят в систему, они перенаправляются в root_path:
class UserSessionsController < ApplicationController
# skip_before_filter :require_login, except: [:destroy]
def new
@user = User.new
end
def create
if @user = login(params[:email], params[:password])
redirect_to root_url, notice: 'Login successful!'
else
flash.now[:alert] = 'Login failed'
render action: 'new'
end
end
def destroy
logout
redirect_to(root_url, notice: 'Logged out!')
end
end
ОДНАКО... я хочу, чтобы в этой ситуации они направлялись к new_testimonial_path, а не только к корневому пути.
Таким образом, чтобы подвести итог, пользователь, не вошедший в систему, нажимает кнопку "Deja tu мнения" (что означает "написать свой отзыв") и, поскольку они не вошли в систему, они направляются в new_user_session_path. Затем они входят в систему и возвращаются в root_path, где им снова придется прокручивать страницу вниз и нажимать кнопку "Deja tu мнение", после чего они переходят в new_testimonial_path.
То, что должно произойти, это то, что не вошедший в систему пользователь нажимает кнопку "Deja tu мнение" и, поскольку он не вошел в систему, направляется в new_user_session_path. Затем они входят в систему и направляются в new_testimonial_path (потому что это то, что они хотели в первую очередь).
Я использовал гем Sorcery, и я почти уверен, что для этого есть метод, называемый redirect_back_or_to, но я просто не могу понять, как его использовать из документации.
Весь код приложения здесь (ветка create_testimonials): https://github.com/Yorkshireman/pamplona_english_teacher2/tree/create_testimonials
Документация волшебства: https://github.com/NoamB/sorcery
Надеюсь, вы можете помочь!
1 ответ
РЕШИТЬ:
У Волшебства есть свой собственный метод под названием require_login, поэтому мой метод require_login, похоже, препятствовал правильному функционированию метода redirect_back_or_to. Поэтому я просто удалил свой метод require_login.
Когда метод redirect_back_or_to запускается в before_filter (или 'before_action' - то же самое), Sorcery вызывает другой из своих собственных методов: not_authenticated. По умолчанию его действие, по-видимому, направить вас к корневому каталогу. Вы можете переопределить это в вашем Application Controller (просто напишите метод not_authenticated в приватном разделе и скажите ему, что делать (в моем случае, "redirect_to new_user_session").
Эти изменения достигли желаемого результата.
Некоторая отличная информация здесь: http://railscasts.com/episodes/283-authentication-with-sorcery?view=asciicast