我想使用after_save回调将updated_by列设置为current_user。但是current_user在模型中不可用。我应该怎么做?after_save回调将updated_by列设置为current_user
6
A
回答
8
您需要在控制器中处理它。首先在模型上执行保存,然后如果成功更新记录字段。
例
class MyController < ActionController::Base
def index
if record.save
record.update_attribute :updated_by, current_user.id
end
end
end
另一种替代方法(我喜欢这个)是创建模型中的一个自定义的方法,该方法包的逻辑。例如
class Record < ActiveRecord::Base
def save_by(user)
self.updated_by = user.id
self.save
end
end
class MyController < ActionController::Base
def index
...
record.save_by(current_user)
end
end
1
我已经实现了基于西蒙娜Carletti酒店的建议此猴补丁,据我可以告诉touch
只做时间戳,而不是用户ID。这有什么不对吗?这是设计用于设计current_user
。
class ActiveRecord::Base
def save_with_user(user)
self.updated_by_user = user unless user.blank?
save
end
def update_attributes_with_user(attributes, user)
self.updated_by_user = user unless user.blank?
update_attributes(attributes)
end
end
然后是create
和update
方法调用这些像这样:
@foo.save_with_user(current_user)
@foo.update_attributes_with_user(params[:foo], current_user)
相关问题
- 1. Rails回调after_save未设置属性
- 2. 轨after_save的回调条件
- 3. 回调 - after_save但不创建
- 4. current_user在rails/devise中设置为零
- 5. 为HttpResponse设置回调
- 6. 如何设置pytest的current_user?
- 7. 如何将update_attributes设置为false的`current_user`存根?
- 8. 将回调设置为回传后的任何控件
- 9. 在after_save回调中返回false和回滚
- 10. 将INT列设置为空
- 11. 将值设置为列表
- 12. 设计辅助方法(current_user)返回零
- 13. 将HUDL设置为调试设备?
- 14. 设计和current_user
- 15. Rails的after_save的回调函数被调用多次
- 16. 如何在使用'counter_cache'时调用after_save回调?
- 17. 如何将回调函数设置为EventEmitter中的第一个回调函数?
- 18. Javascript回调时变量设置为X
- 19. 如何为回调设置SuppressUnmanagedCodeSecurity?
- 20. 设置结构方法为回调
- 21. 如何根据current_user设置默认值?
- 22. 如何将chrome.alarms.getAll回调函数设置为变量?
- 23. jquery将ajax结果设置为外部变量回调
- 24. 将列设置为0,概率为p
- 25. 使用after_save回调修改同一对象而不触发回调(递归)
- 26. 如何使用rails_admin创建新模型时将用户设置为current_user
- 27. 设计current_user vs user_session
- 28. 设计 - auth_token和current_user
- 29. 如何为演示目的设置默认current_user
- 30. 仅列信息将FMTONLY设置为OFF时返回
+1触控方法:) – lucapette
之所以把它在模型的是,它是干的,因为保存( )可以从应用程序中的许多地方调用,而不仅仅是一个控制器。我宁愿只做一次,也不必重复我的自我,并担心总是记住设置它。 – pixelearth
然后创建一个新方法,如Model.save_from_user(用户),并在那里放置逻辑以保存记录并执行触摸操作。然后,在你的控制器中简单地调用该方法传递'current_user'作为参数。 –