我有一个多租户应用程序,我正在设置当前的租赁:
class ApplicationController < ActionController::Base
around_filter :scope_current_tenancy
def scope_current_tenancy
Tenancy.current_id = current_tenancy.id if request.subdomain != 'www'
yield
ensure
Tenancy.current_id = nil
end
end
然后在我的用户模型中,我定义了default_scope
,只能访问我的租户中的用户:
class Postulant < ActiveRecord::Base
default_scope ->{ where("enlistments.tenancy_id = ?", Tenancy.current_id).includes(:enlistments).references(:enlistments) }
此操作到目前为止,但现在使用devise_invitable
并尝试接受邀请我收到Filter chain halted as :resource_from_invitation_token rendered or redirected
消息。问题是因为我的scope_current_tenancy
过滤器正在resource_from_invitation_token
之后执行,因此resource
未正确加载。
class Devise::InvitationsController < DeviseController
prepend_before_filter :resource_from_invitation_token, :only => [:edit, :destroy]
def resource_from_invitation_token
# Here 'resource_class' is my Postulant model, so when I call
# 'find_by_invitation_token' applies the defined default_scope
# which doesn't word without 'scope_current_tenancy'
unless params[:invitation_token] && self.resource = resource_class.find_by_invitation_token(params[:invitation_token], true)
set_flash_message(:alert, :invitation_token_invalid)
redirect_to after_sign_out_path_for(resource_name)
end
end
end
所以我的问题是,有没有办法比:scope_current_tenancy
之前运行:resource_from_invitation_token
?
我试图将around_filter :scope_current_tenancy
更改为prepend_around_filter :scope_current_tenancy
,但我没有运气。有什么想法吗?
答案 0 :(得分:1)
因为prepend_before_filter :resource_from_invitation_token
位于ApplicationController之后,所以即使您对scope_current_tenancy使用prepend_before_filter,此过滤器也会被添加到过滤器链的前面。一种选择可能是尝试类似的东西:
skip_around_filter :scope_current_tenancy
prepend_before_filter :resource_from_invitation_token, :only => [:edit, :destroy]
prepend_around_filter :scope_current_tenancy
你的Devise :: InvitationsController中的
不确定这是否有效,但似乎值得一试。
或者,您可以删除'skip_around_filter'行,假设scope_current_tenancy是幂等的,这似乎就是这种情况。