如何将 mixpanel-ruby 与 Devise 集成?

Dea*_*ean 3 devise ruby-on-rails-3 mixpanel

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

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

如果覆盖 create,我应该在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
Run Code Online (Sandbox Code Playgroud)

ros*_*sta 5

您提出的任何方法都可以工作。哪种方法最好是一个意见问题,很大程度上取决于您和您的团队的偏好。跟踪代码所需的参数也可能表明一种方法比另一种方法更可取。

话虽如此,这就是我的想法:

  • 我不建议覆盖after_sign_in_path_for(resource)。我会考虑在您希望返回 url 的方法之上添加 mixpanel 跟踪,这有点副作用,这是我想避免的。

  • 对我来说稍微好一点会被覆盖,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
    
    Run Code Online (Sandbox Code Playgroud)
  • 总的来说,我更喜欢使用过滤器,因为我认为这是在控制器操作之上添加切向行为的更自然的方式。

    class YourController < Devise::SessionsController
      # or after_action in Rails 4+
      after_filter :track_sign_in 
    end
    
    Run Code Online (Sandbox Code Playgroud)

任何解决方案都涉及覆盖 Devise 提供的某些方面,因此在我看来,选项之间的差异非常小。