0

我在我的多租户应用程序中使用 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/dt2kqvgmdt2kqvgm记录的友好 ID 在哪里。所以我想调用类似的东西:

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

当我创建/更新记录等时

目前我得到:

undefined method `tenant_name' for nil:NilClass

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

{"utf8"=>"✓&quot;, "_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"}
4

1 回答 1

0

我不知道这是否是最好的方法,但它有效。我知道它需要调整,但这是一个开始 - 你需要:

  1. 设置around_action过滤器
  2. 添加 allowed_pa​​rams
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操作中。

于 2020-10-07T19:18:05.120 回答