我正致力于将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
干杯!
答案 0 :(得分:4)
您提出的任何方法都可行。哪种方法最好是意见问题,在很大程度上取决于您和您的团队的偏好。跟踪代码所需的参数也可能要求一种方法比另一种方法更优选。
那就是说,这就是我的想法:
我不建议覆盖after_sign_in_path_for(resource)
。我会考虑在您希望返回某个网址的方法之上添加mixpanel跟踪,这有点像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提供的某些方面,因此我认为选项之间的差异非常微不足道。
答案 1 :(得分:0)
你也可以使用Warden的after_set_user钩子。文档声明:
设置用户每次设置后运行的回调挂钩。这个 第三次发生这三个事件中的一个时触发回调 在请求期间:: authentication,:fetch(来自session)和: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