我正在整合mixpanel-ruby
与设计。我有一个初学者的问题,在哪个功能我应该包括跟踪逻辑?
例如,为了跟踪成功登录,我应该覆盖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
您提出的任何一种方法都可行。哪种方法是最好的是一个意见问题,很大程度上取决于您和您的团队的偏好。跟踪代码所需的参数也可能规定一种方法比另一种方法更可取。
话虽如此,我的想法是:
-
我不建议覆盖
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
-
总的来说,我更喜欢使用过滤器,因为我认为这是在控制器动作之上添加切向行为的一种更自然的方式。
class YourController < Devise::SessionsController # or after_action in Rails 4+ after_filter :track_sign_in end
任何解决方案都涉及重写设计提供的某些方面,因此在我看来,选项之间的差异相当微不足道。
你也可以使用Warden的after_set_user钩子。文档状态:
在用户被设置后每次运行的回调钩子。这这三个事件中的一个第一次发生时触发回调在request::authentication,:fetch (from 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