我正在研究电子商务解决方案,它在单个 Rails 应用程序中提供了几个不同的商店。
我有一个类来保存特定于商店的设置。
# models/shop.rb
class Shop < Settingslogic
source "#{Rails.root}/config/shop.yml"
def self.init!(shop)
namespace shop.to_s
load!
end
end
商店::初始化!从配置文件加载指定部分
这是 yml 文件以防万一:
# config/shop.yml
shop_1:
shop_name: Shop 1
shop_2:
shop_name: Shop 2
我在应用程序控制器中按域名匹配请求的商店。
# controllers/application_controller.rb
class ApplicationController < ActionController::Base
before_filter :set_shop
protected
def set_shop
Shop.init! if request.domain.match(/^.*shop1\.com$/)
:shop_1
elsif request.domain.match(/^.*shop2\.com$/)
:shop_2
end
end
end
问题是 Shop 在请求之间以某种方式保留了第一个请求的商店的设置。例如:
shop1.com
Shop.shop_name # => Shop 1
shop2.com
Shop.shop_name # => Shop 1
它会保留初始设置,直到我对 application_controller.rb 或 shop.rb 进行一些更改。(我认为这是答案的第一把钥匙)
我所知道的是 Settingslogic 为 shop.yml 中的每个选项定义了 attr_accessor (仅在第一次调用时)。但是为什么它们在重新加载后仍然有效(我在 cache_classes = false 的开发环境中工作)
当我这样做时:
# models/shop.rb
class Shop < Settingslogic
source "#{Rails.root}/config/shop.yml"
namespace "shop_#{Random.rand(1..2)}"
load!
end
它按预期工作 - 它每次都会加载适当的设置。但我不能在这个阶段按域设置商店名称。当我无法从外部指定 shop_name 时,我也无法测试不同的商店。所以我需要一个方法。
我试过class_eval
def self.init!(shop)
class_eval do
namespace shop.to_s
load!
end
end
但这没有帮助。我觉得这里缺乏关于范围界定的知识。你有什么想法吗?提前致谢。