在Active Admin Controller中设置多租户Searchkick索引必需

问题描述

我在多租户应用中使用Active Admin。我还使用Searchkick,该模型在每个模型中都有一个自定义的租户特定索引:

class Budget < ApplicationRecord

  multi_tenant :company

  searchkick inheritance: true,index_name: -> { [MultiTenant.current_tenant.tenant_name,model_name.plural,Rails.env].join('_') }

end

问题在于在AA中,此逻辑失败,因为已设置了租户。我希望能够在更新记录时在AA中进行设置。

例如,我将更新http:// localhost:4000 / admin / budgets / dt2kqvgm,其中dt2kqvgm是记录的友好ID。所以我想打电话给类似的人

MultiTenant.current_tenant = Budget.friendly.find(params['budget']['company_id'])

当我创建/更新记录等时

我现在得到:

undefined method `tenant_name' for nil:NilClass

因为在我的应用程序控制器中,租户是根据用户身份验证设置的,以确定当前公司的范围等。在AA中,我希望/需要根据似乎无法从AA控制器逻辑访问的参数进行设置。我的参数在AA中看起来像这样:

{"utf8"=>"✓","_method"=>"patch","authenticity_token"=>"PrhNGnPvV1Qfb5RCwTVv4Wwz9tjf9SFy2VWDcyJXoFLytM8y5ZAyF7h8I7xa+fy01E9Fc/v2CvR52I4/LKOLHQ==","budget"=>{"company_id"=>"9","name"=>"qweqwe","description"=>"qweqwe","notes"=>"qwee","flag_active"=>"1","slug"=>"dt2kqvgm","title"=>"qweqwe"},"commit"=>"Update Budget","controller"=>"admin/budgets","action"=>"update","id"=>"dt2kqvgm"}

解决方法

我不知道这是否是执行此操作的最佳方法,但它确实有效。我知道它需要调整,但这只是一个开始-您需要:

  1. 设置一个around_action过滤器
  2. 添加允许的参数
around_action :set_tenant,only: :update

controller do

  def set_tenant
    MultiTenant.with(Company.find(resource.company_id)) do
      yield
    end
  end

  def permitted_params
    params.permit location: %[ company_id ]
  end

end

似乎每个控制器都需要它。也许有一种方法可以将其添加为默认的AA过滤器?

我还将过滤器添加到了update操作中。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...