Devise-在身份验证之后,但在重定向之前执行操作



我试图在创建会话之后和重定向之前执行操作。用户订阅了一个课程,在他们选择了一个要注册的课程后,我想提供一个选项,只需登录,并使用他们现有的档案卡完成购买,而不需要让他们再次经历这个过程(表单上明确表示这将发生)。

我目前正在覆盖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

用户单击Log in:后,我有4个目标

  1. 让用户登录
  2. 从隐藏字段中提取课程数据,并通过API请求在用户卡中签名收费
  3. API响应成功后,在数据库中为用户创建一个位置
  4. 重定向至或重新呈现带有成功或错误消息的页面

我已经列出了第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

如果您不这样做,那么在执行代码之前,将调用design的create方法中的redirect_to。

最新更新