具有自定义域的多租户应用程序:如何在初始化程序和邮件程序中填充租户特定数据?

时间:2015-06-03 05:58:56

标签: ruby-on-rails ruby-on-rails-4 devise multi-tenant

我正在创建一个使用Devise进行身份验证的多租户应用,该应用有一个初始化文件来设置应用特定信息。

我还想在邮寄者中使用租户的域名信息。

存储此信息并将其填充到初始化程序和邮件程序中的最佳方法是什么?

2 个答案:

答案 0 :(得分:0)

您不应该在文件中包含租户特定信息,包括邮件信息。自然是将信息存储在数据库表中。如果您正确设置了多租户应用程序,则每个租户的数据库数据与其他租户完全分开。

例如,您可以拥有表 TenantInformation ,并将所有租户特定信息(如邮件连接字符串)放入其中。 根据Rails verision,您可以在发送带有:delivery_method_options 的电子邮件之前设置邮件连接选项dinamicaly: http://edgeguides.rubyonrails.org/action_mailer_basics.html

您可以使用https://github.com/influitive/apartment等现有解决方案,以便更轻松地与租户合作。

答案 1 :(得分:0)

我能想出的最好的方法是在邮件中正确包含租户子域并查看链接/网址是猴子补丁url_for(其他网址助手在内部使用):

module ActionDispatch::Routing
  class RouteSet

    alias_method :original_url_for, :url_for
    def url_for(options, route_name = nil, url_strategy = UNKNOWN)
      dynamic_options = Rails.application.config.respond_to?(:dynamic_url_options) ? Rails.application.config.dynamic_url_options.call : {}
      options = options.merge(default_url_options).merge(dynamic_options)

      original_url_for options, route_name, url_strategy
    end
  end
end

将其放在lib/dynamic_url_options.rb中,然后将require 'dynamic_url_options'放在环境文件的顶部。然后你可以这样做:

config.dynamic_url_options = lambda {{
  :subdomain => Apartment::Tenant.current
}}

如果您在自己的环境中添加租户名称前缀,则必须在此lambda中对staging_前缀进行额外删除。