魔法 gem - 如何使用 redirect_or_back_to 方法
Sorcery gem - how to use the redirect_or_back_to method
当未登录用户单击此页面上的 'Deja Tu Opinion' 按钮时:
...用户被重定向到登录页面,并显示一条消息 "you must login or signup before continuing"。我已经做到了 - 这里没问题。
'Deja Tu Opinion' 按钮指向 new_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,而不仅仅是回到root_path.
因此,总而言之,未登录的用户单击 'Deja tu opinion' 按钮(这意味着 'write your own testimonial'),并且由于他们未登录,他们被定向到new_user_session_path。然后他们登录并被带回 root_path,然后他们必须再次向下滚动页面并单击 'Deja tu opinion' 按钮,然后他们将被带到 new_testimonial_path。
想要发生的事情是让未登录的用户单击 'Deja tu opinion' 按钮,并且由于他们未登录,因此被定向到 new_user_session_path。然后他们登录并被定向到 new_testimonial_path(因为这是他们首先想要的)。
我使用了 Sorcery gem,我很确定有一种方法可以实现这一点,称为 'redirect_back_or_to',但我无法从文档。
整个应用程序的代码在这里(create_testimonials 分支):https://github.com/Yorkshireman/pamplona_english_teacher2/tree/create_testimonials
Sorcery 的文档:
https://github.com/NoamB/sorcery
希望能帮到你!
已解决:
Sorcery 有自己的方法 require_login,所以我的 require_login 方法似乎阻止了 redirect_back_or_to 方法的正常运行。因此,我干脆删除了我的 require_login 方法。
当 redirect_back_or_to 方法在 before_filter(或 'before_action' - 同样的事情)中被触发时,Sorcery 调用它的另一个本地方法:not_authenticated。它的默认操作似乎是将您引导至 root_path。您可以在您的应用程序控制器中覆盖它(只需在私有部分编写一个名为 'not_authenticated' 的方法并告诉它做什么(在我的例子中,"redirect_to new_user_session")。
这些改动达到了预期的效果。
这里有一些很棒的信息:
http://railscasts.com/episodes/283-authentication-with-sorcery?view=asciicast
当未登录用户单击此页面上的 'Deja Tu Opinion' 按钮时:
...用户被重定向到登录页面,并显示一条消息 "you must login or signup before continuing"。我已经做到了 - 这里没问题。
'Deja Tu Opinion' 按钮指向 new_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,而不仅仅是回到root_path.
因此,总而言之,未登录的用户单击 'Deja tu opinion' 按钮(这意味着 'write your own testimonial'),并且由于他们未登录,他们被定向到new_user_session_path。然后他们登录并被带回 root_path,然后他们必须再次向下滚动页面并单击 'Deja tu opinion' 按钮,然后他们将被带到 new_testimonial_path。
想要发生的事情是让未登录的用户单击 'Deja tu opinion' 按钮,并且由于他们未登录,因此被定向到 new_user_session_path。然后他们登录并被定向到 new_testimonial_path(因为这是他们首先想要的)。
我使用了 Sorcery gem,我很确定有一种方法可以实现这一点,称为 'redirect_back_or_to',但我无法从文档。
整个应用程序的代码在这里(create_testimonials 分支):https://github.com/Yorkshireman/pamplona_english_teacher2/tree/create_testimonials
Sorcery 的文档: https://github.com/NoamB/sorcery
希望能帮到你!
已解决:
Sorcery 有自己的方法 require_login,所以我的 require_login 方法似乎阻止了 redirect_back_or_to 方法的正常运行。因此,我干脆删除了我的 require_login 方法。
当 redirect_back_or_to 方法在 before_filter(或 'before_action' - 同样的事情)中被触发时,Sorcery 调用它的另一个本地方法:not_authenticated。它的默认操作似乎是将您引导至 root_path。您可以在您的应用程序控制器中覆盖它(只需在私有部分编写一个名为 'not_authenticated' 的方法并告诉它做什么(在我的例子中,"redirect_to new_user_session")。
这些改动达到了预期的效果。
这里有一些很棒的信息: http://railscasts.com/episodes/283-authentication-with-sorcery?view=asciicast