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

时间:2016-01-06 01:49:23

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

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

我目前正在覆盖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. 使用成功或错误消息重定向或重新呈现页面。
  5. 我已经完成了第2步和第3步的所有逻辑,显然分享了所有不相关的内容。我遇到的问题是如何使用super中的SessionsController来记录用户,但延迟重定向直到我执行了我的操作。我正在使用after_sign_in_path_for

    或者另一种选择是完全取出super并自己手动完成整个身份验证。但我觉得这是不必要的。

1 个答案:

答案 0 :(得分: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

如果你不这样做,在你的代码执行之前,将调用redirect_to内部设计的create方法。