如何将mixpanel-ruby与Devise集成?

问题描述 投票:3回答:2

我正在将mixpanel-ruby与Devise集成。我有一个初学者的问题,应该在哪个函数中包含跟踪逻辑?

例如,为了跟踪成功的登录,我应该覆盖SessionsController#create还是after_sign_in_path_for(resource)

如果覆盖创建,我应该在create函数中插入代码还是以某种方式利用block

  def create
    self.resource = warden.authenticate!(auth_options)
    set_flash_message(:notice, :signed_in) if is_flashing_format?
    sign_in(resource_name, resource)
    yield resource if block_given?
    <<< insert mixpanel tracking code >>>
    respond_with resource, location: after_sign_in_path_for(resource)
  end
ruby-on-rails-3 devise mixpanel
2个回答
4
投票

您提出的任何方法都可以使用。哪种方法最好是一个意见问题,并且在很大程度上取决于您和您的团队的偏好。跟踪代码所需的参数还可能指示一种方法比另一种方法更可取。

也就是说,这就是我的想法:

  • 我不建议覆盖after_sign_in_path_for(resource)。我会考虑在希望返回url有点像side effect的方法的顶部添加混合面板跟踪,这是我想避免的事情。

  • 对我来说稍微好一点的是将覆盖SessionsController#create,因为我发现在此处添加跟踪行为并不奇怪。这可能是以下内容的变体:

    class YourController < Devise::SessionsController
      def create
        super
        track_sign_in(this.resource) if signed_in?
      end
    
      # or taking advantage of the block
      def create
        super do |resource|
          track_sign_in(resource) if signed_in?
        end
      end
    
      private
      def track_sign_in(resource)
        # yada yada
      end
    end
    
  • 总体上,我更喜欢使用过滤器,因为我认为这是在控制器操作之上添加切线行为的更自然的方法。

    class YourController < Devise::SessionsController
      # or after_action in Rails 4+
      after_filter :track_sign_in 
    end
    

任何解决方案都涉及重写Devise提供的功能的某些方面,因此我认为选项之间的差异很小。


0
投票

您还可以使用Warden的after_set_user挂钩。文档状态:

设置了在设置用户后每次运行的回调挂钩。这个 这三个事件之一第一次触发回调 在请求期间::authentication,:fetch(来自会话)和:set_user (当手动设置时)。您可以提供任意数量的钩子,并且 它们将按照声明的顺序运行。

这是如何运作的。注意对事件的检查:

Warden::Manager.after_set_user do |record, warden, options|
  if options[:event] == :authentication
    # Do authentication things
  end
end

此处有更多信息:http://www.rubydoc.info/github/hassox/warden/Warden/Hooks:after_set_user

© www.soinside.com 2019 - 2024. All rights reserved.