我有一个现有的 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,只需将它们作为字段添加到组织模型中。但如果我能避免的话,我宁愿不要。
编辑:
我认为这可能是问题所在?创建表以存储设置的迁移会添加索引。
不确定删除唯一约束是否有效。在这种情况下,我认为应该这样做,因为acts_as_tenant 正在为我确定数据库调用的范围......只是一个想法。还在寻找。