首页 > 解决方案 > Tennat 范围内的电子邮件网址

问题描述

在 Rails 6 应用程序中,我需要将电子邮件中生成的 URL 限定为当前租户(为此我使用的是 Apartment)。

所以,一个正确的 URL 看起来像http://localhost:3000/tenant_name/dashboard

使用Middleware类似于https://github.com/gorails-screencasts/gorails-episode-234/blob/master/lib/account_middleware.rb的方式将租户添加到 URL

class AccountMiddleware
  def initialize(app)
    @app = app
  end

  # http://example.com/12345/projects
  def call(env)
    _, organization_name, request_path = env["REQUEST_PATH"].split('/', 3)

    if true
      if organization = Organization.find_by(name: organization_name)
        Current.organization = organization
      else
        return [302, { "Location" => "/" }, []]
      end

      env["SCRIPT_NAME"]  = "/#{organization_name}"
      env["PATH_INFO"]    = "/#{request_path}"
      env["REQUEST_PATH"] = "/#{request_path}"
      env["REQUEST_URI"]  = "/#{request_path}"
    end

    @app.call(env)
  end
end

与以下

#/config/routes.rb
get 'dashboard', to: 'dashboard#show'

如果我只是使用root_url我会得到http://localhost:3000/dashboard哪个不起作用。

在尝试了几种方法后,我想出了

"#{ActionMailer::Base.default_url_options[:protocol]}://#{ActionMailer::Base.default_url_options[:host]}/#{Apartment::Tenant.current}#{dashboard_url(only_path: true)}" 

哪个有效,但很丑陋。

关于如何使它变得更好的任何想法?

标签: ruby-on-railsactionmailer

解决方案


推荐阅读