Rails:Authlogic&用户会话&回调

时间:2017-01-16 02:14:21

标签: ruby-on-rails callback authlogic

我想在每次用户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模型上实际回调?它目前看起来对我来说是最好的方式。

0 个答案:

没有答案