【问题标题】:Devise - Perform actions after authentication, but before redirect设计 - 在身份验证之后但在重定向之前执行操作
【发布时间】:2016-04-10 00:39:06
【问题描述】:

我正在尝试在创建会话之后和重定向之前执行操作。用户订阅了课程,并且在他们选择了要注册的课程后,我想提供一个选项来登录,并使用他们存档的现有卡来完成购买,而无需让他们通过再次处理(非常清楚地说明这将发生在表单上)。

我目前正在覆盖 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 并自己手动进行整个身份验证。但我觉得这是不必要的。

【问题讨论】:

    标签: ruby-on-rails session authentication devise haml


    【解决方案1】:

    你应该在一个块中传递你的逻辑,像这样:

    class SessionsController < Devise::SessionsController
      def create
        super do
          my_service = MyService.new
          my_service.charge_card_and_create_event(resource, params)
        end
      end
    end
    

    如果你不这样做,在你的代码被执行之前,devise的create方法里面的redirect_to会被调用。

    【讨论】:

    • 啊,谢谢你,我知道它必须像这样简单!我会在几个小时内尝试一下。
    猜你喜欢
    • 1970-01-01
    • 2012-03-11
    • 1970-01-01
    • 1970-01-01
    • 2013-04-24
    • 2016-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多