新手问题 如何得到 current_user 在 rails model/observer 中?

small_fish__ · 2014年03月25日 · 最后由 billy 回复于 2014年03月25日 · 3001 次阅读

一些常规解决办法 http://amitrmohanty.wordpress.com/2014/01/20/how-to-get-current_user-in-model-and-observer-rails/ ,但是这样安全吗?貌似以前在坛子有人谈论这个,说不安全。。

这里还有另外一种解决办法 https://github.com/steveklabnik/request_store,貌似说要安全点,是真的吗?

我一开始也是用 User.current,后来直接给 model 加了 attr_accessor :operator_id ,需要的时候就在 controller 设置一下。

原来你是要记录用户的事件。

Model 可以拿到 current_user,需要拐个弯。但我不喜欢这种做法。职能混淆。因为 model 不需要接触 controller context。

有一个 gem Public Activity 就是这么记录的。

因为我不喜欢这个做法,所以我自己写了一个 [Simple Activity](https://github.com/billychan/simple_activity), 从 controller 出发,不沾 models。你既可以显示在界面中,也可以选择不显示,留着若干原始记录备用。demo 在此。用得上的话请多提宝贵意见。

#1 楼 @_samqiu 很好,这个是可以的,但是如果 resource 比较多的化,这样会比较郁闷,代码修改地方太多了,而且也不太好吧,都是一样的代码。

#2 楼 @billy 表示项目使用的是 rails3.xx 这个会有影响吗?

@small_fish__ 没影响的,在这里的主要区别就是有没有 attr_accessible,我加了判断的。测试在 Rails 3.2.16 下面跑过没问题,不过没写到 fixture 中。

#5 楼 @billy OK,thanks,,一种新的角度解决问题,很不错,对于 loging 来说感觉足够了,研究代码去了,,

@small_fish__ 不客气,能有用就好。求粉,求 PR,求白鼠... 最后一个不好意思说出口哈。

#7 楼 @billy 看了下 gem,整个代码都很 nice, 不过我有几个疑问。 1: 如果有一些 custom action,假如出现极端情况,会不会造成 filter action 配置不好维护。

https://github.com/billychan/simple_activity/blob/master/lib/generators/simple_activity/templates/simple_activity.rb#L7 2: 关于 cache text 如何支持国际化?

https://github.com/billychan/simple_activity/blob/master/lib/simple_activity/services/activity_processor.rb#L106

  1. 是否根据此代码作一些扩展,比如有些 action,其实是查询的,但是也想记录下来。

@small_fish__ @_samqiu 我目前也是用 User.current 来解决……同求更好的解决方案。

@small_fish__ 多谢。

关于 1,只要是 REGEXP 能抓住的都没有问题啊,不太明白极端情况是什么。

关于 2. 其实 cache_text 目前是有些小缺陷的,就是更新那一块没有经过测试,用的时候得注意这点。按常理既然是 cache 就应该是可以 destroy and re-build。当时考虑到 Activity Feed 一般情况下都是看了几个最新的就算,老的历史记录一般是用来做研究而不是给用户看,这个不是主要需求,所以没往深做。只写了个 update 的草稿,没文档,没测试。

i18n 我不太懂。这个 cache_text 只是储存原本 model method 返回的文本结果,不知道 i18n 有无问题。你若知道请指教。

关于 3:任何 action 都是可以的,你可以在 config 里面设置。默认 create|destroy|update.

要有什么新的想法欢迎随时提交 issue 探讨,就不占 ruby-china 的版面了。

需要 登录 后方可回复, 如果你还没有账号请 注册新账号