Волшебный камень - как использовать метод redirect_or_back_to

Когда незарегистрированный пользователь нажимает кнопку "Мнение Deja Tu" на этой странице:

https://github.com/Yorkshireman/pamplona_english_teacher2/blob/create_testimonials/app/views/static_pages/home.html.erb

... пользователь перенаправляется на страницу входа в систему с сообщением "Вы должны войти или зарегистрироваться перед тем, как продолжить". Я сделал это - нет проблем здесь.

Кнопка "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

Другие вопросы по тегам