我想在每次用户current_login_ip
更改时调用服务来查找位置数据。
现在,实现这一目标的一种方法是
class User
#...
after_save :kickoff_job_to_find_location, if: :current_login_ip_changed?
end
但是,如果可以的话,我很想避免添加ActiveRecord回调。
所以,我沿着这样的路线定制了UserSession:
class UserSession < Authlogic::Session::Base
before_create :set_update_location
def should_update_location?
@should_update_location
end
private
def set_update_location
@should_update_location ||= record && (record.current_login_ip != record.current_login_ip_was)
end
end
然后,从我的控制器,我可以调用user_session.should_update_location?
并执行一些逻辑。
然而,问题是(据我所知,从测试中)所有回调都被复制到User
模型中,因此如果您创建用户模型,那么也执行上面在UserSession中定义的before_create。即使您没有创建UserSession ,也会发生。这意味着我的@should_update_location
被调用了两次(一次是在创建用户时,一次是在创建会话时),但是在创建会话时,current_login_ip
已被设置,所以我的{{ 1}}返回false。
我可以通过简单地从UserSession本身调用我的方法来解决它:
should_update_location?
但这似乎并不好看。所以我目前放弃了,并在User上实现了class UserSession < Authlogic::Session::Base
before_create :update_location_if_new_or_changed
private
def update_location_if_new_or_changed
if record && (!record.persisted? || (record.current_login_ip != record.current_login_ip_was))
puts "calling set_update_location"
end
end
end
挂钩。
执行此类&#34的正确方法是什么?如果current_login_ip发生变化&#34;行为?在这种情况下,是否可以在User模型上实际回调?它目前看起来对我来说是最好的方式。