【问题标题】:Set Multi Tenant in Active Admin Controllers (required for Searchkick index)在活动管理控制器中设置多租户(Searchkick 索引需要)
【发布时间】:2020-09-02 02:10:47
【问题描述】:

我在我的多租户应用程序中使用 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"}

【问题讨论】:

  • 应该是permitted_params
  • 当这个中断并且我在代码中回滚时,似乎参数在 AA 控制器中甚至不可用。
  • permitted_params 应该可用。我建议添加一个pry 断点并四处寻找。你可以看到permitted_params 被读取here

标签: activeadmin searchkick acts-as-tenant


【解决方案1】:

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

  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 操作中添加了过滤器。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-19
    • 2020-06-24
    • 1970-01-01
    相关资源
    最近更新 更多