0

我有一个现有的 Rails 5.2 应用程序,我正在向其中添加多租户支持。到目前为止,它与acts_as_tenant 完美配合,除了站点设置。

我正在使用 rails-settings-cached 来处理一些非常简单的站点范围的变量。从这里开始,这些对于每个租户来说都是唯一的(每个租户都可以控制自己的设置。)

这是代码。首先,设置模型:

# RailsSettings Model
class Setting < RailsSettings::Base
  acts_as_tenant :organisation

  field :club_name, validates: { presence: true }
  field :club_address, validates: { presence: true }
  field :club_website_address, validates: { presence: true }
  field :require_approvals, type: :boolean, default: false
end

设置控制器:

module Admin
  class SettingsController < ApplicationController
    authorize_resource

    def index

    end

    def create
      setting_params.keys.each do |key|
        Setting.send("#{key}=", setting_params[key].strip) unless setting_params[key].nil?
      end
      flash[:success] = "Settings saved successfully"
      redirect_to admin_settings_path
    end

    private
      def setting_params
        params.require(:setting).permit(:club_name, :club_address, :club_website_address, :require_approvals)
      end
  end
end

视图中的片段:

<%= simple_form_for(Setting.new, url: admin_settings_path) do |f| %>
        <div class="form-group">
          <label class="control-label">Club Name</label>
          <%= f.text_field :club_name, value: Setting.club_name, class: "form-control"  %>
        </div>
        <div class="form-group">
          <label class="control-label">Club Address</label>
          <%= f.text_field :club_address, value: Setting.club_address, class: "form-control"  %>
        </div>
        <div class="form-group">
          <label class="control-label">Club Website</label>
          <%= f.text_field :club_website_address, value: Setting.club_website_address, class: "form-control"  %>
        </div>
        <div class="form-group form-checkbox">
          <label>
            <%= f.check_box :require_approvals, checked: Setting.require_approvals? %>
          </label>
        </div>

        <div class="form-actions">
          <%= f.button :submit, "Save Settings" %>
        </div>
      <% end %>

所以这就是问题所在。我在新环境中清除了所有以前的设置,然后登录到第一个租户。设置为空(如预期的那样。)向所有字段添加值并保存工作,当我通过控制台检查结果时,我可以看到acts_as_tenant 已正确填充了每个设置的 organization_id 字段。

但是,当我登录第二个租户时,表单包含第一个租户的所有设置。如果我尝试做出改变,我会受到以下打击:

PG::UniqueViolation: ERROR: duplicate key value violates unique constraint "index_settings_on_var" DETAIL: Key (var)=(club_name) already exists. : INSERT INTO "settings" ("var", "value", "created_at", "updated_at", "organisation_id") VALUES ($1, $2, $3, $4) RETURNING "id"

错误来自 SettingsController 中的这行代码:

Setting.send("#{key}=", setting_params[key].strip) unless setting_params[key].nil?

那么是否可以适当地确定范围,以便我可以对每个租户进行不同的设置?

一个备用选项是完全删除此 gem,只需将它们作为字段添加到组织模型中。但如果我能避免的话,我宁愿不要。

编辑:

我认为这可能是问题所在?创建表以存储设置的迁移会添加索引。

https://github.com/huacnlee/rails-settings-cached/blob/main/lib/generators/settings/templates/migration.rb

不确定删除唯一约束是否有效。在这种情况下,我认为应该这样做,因为acts_as_tenant 正在为我确定数据库调用的范围......只是一个想法。还在寻找。

4

0 回答 0