设计 - 在身份验证之后执行操作,但在重定向之前
Devise - Perform actions after authentication, but before redirect
我正在尝试在创建会话之后和重定向之前执行操作。用户订阅了一节课,在他们选择了一节课注册后,我想提供一个选项,让他们直接登录,并使用他们现有的存档卡来完成购买,而不需要让他们通过再次处理(非常清楚地说明这将在表格上发生)。
我目前正在覆盖 Devise 的默认操作,如下所示:
Rails.application.routes.draw do
devise_for :users, controllers: {registrations: 'registrations', sessions: 'sessions'}
end
并使用此控制器:
class SessionsController < Devise::SessionsController
def create
super
my_service = MyService.new
my_service.charge_card_and_create_event(resource, params)
end
end
使用这种形式:
= form_for(resource, as: resource_name, url: session_path(resource_name)) do |f|
= f.email_field :email, autofocus: true, class: 'signin-fields', placeholder: "Email"
= f.password_field :password, autocomplete: "off", class: 'signin-fields', placeholder: "Password"
=hidden_field_tag "lesson_name", @lesson.team_name
=hidden_field_tag "lesson_price", @lesson.price_per_student
%br
= f.submit "Log in", class: 'btn btn-ps-sm'
.shared-links#forgot-password
用户点击后我有 4 个目标 Log in
:
- 让用户登录。
- 从隐藏字段中提取课程数据,并通过API请求对登录用户的卡进行收费。
- 成功API响应后,在数据库中为用户创建一个点。
- 使用成功或错误消息重定向或重新呈现页面。
我已经列出了第 2 步和第 3 步的所有逻辑,并且显然共享了所有不相关的内容。我卡住的地方是弄清楚如何在 SessionsController
中使用 super
来让用户登录,但延迟重定向直到我执行完我的操作。我正在使用 after_sign_in_path_for
。
或者另一种选择是完全删除 super
并自己手动完成整个身份验证。但是我觉得没必要。
您应该在一个块中传递您的逻辑,如下所示:
class SessionsController < Devise::SessionsController
def create
super do
my_service = MyService.new
my_service.charge_card_and_create_event(resource, params)
end
end
end
如果您不这样做,redirect_to 内部的 devise 的 create 方法将在执行您的代码之前被调用。
我正在尝试在创建会话之后和重定向之前执行操作。用户订阅了一节课,在他们选择了一节课注册后,我想提供一个选项,让他们直接登录,并使用他们现有的存档卡来完成购买,而不需要让他们通过再次处理(非常清楚地说明这将在表格上发生)。
我目前正在覆盖 Devise 的默认操作,如下所示:
Rails.application.routes.draw do
devise_for :users, controllers: {registrations: 'registrations', sessions: 'sessions'}
end
并使用此控制器:
class SessionsController < Devise::SessionsController
def create
super
my_service = MyService.new
my_service.charge_card_and_create_event(resource, params)
end
end
使用这种形式:
= form_for(resource, as: resource_name, url: session_path(resource_name)) do |f|
= f.email_field :email, autofocus: true, class: 'signin-fields', placeholder: "Email"
= f.password_field :password, autocomplete: "off", class: 'signin-fields', placeholder: "Password"
=hidden_field_tag "lesson_name", @lesson.team_name
=hidden_field_tag "lesson_price", @lesson.price_per_student
%br
= f.submit "Log in", class: 'btn btn-ps-sm'
.shared-links#forgot-password
用户点击后我有 4 个目标 Log in
:
- 让用户登录。
- 从隐藏字段中提取课程数据,并通过API请求对登录用户的卡进行收费。
- 成功API响应后,在数据库中为用户创建一个点。
- 使用成功或错误消息重定向或重新呈现页面。
我已经列出了第 2 步和第 3 步的所有逻辑,并且显然共享了所有不相关的内容。我卡住的地方是弄清楚如何在 SessionsController
中使用 super
来让用户登录,但延迟重定向直到我执行完我的操作。我正在使用 after_sign_in_path_for
。
或者另一种选择是完全删除 super
并自己手动完成整个身份验证。但是我觉得没必要。
您应该在一个块中传递您的逻辑,如下所示:
class SessionsController < Devise::SessionsController
def create
super do
my_service = MyService.new
my_service.charge_card_and_create_event(resource, params)
end
end
end
如果您不这样做,redirect_to 内部的 devise 的 create 方法将在执行您的代码之前被调用。