我正在開發電子商務解決方案,該解決方案在單個導軌應用程序內提供幾個不同的商店。如何在請求之間重置ruby類訪問器?
在那裏我有一個類來舉辦商店特定的設置。
# models/shop.rb
class Shop < Settingslogic
source "#{Rails.root}/config/shop.yml"
def self.init!(shop)
namespace shop.to_s
load!
end
end
Shop :: init!從加載配置文件
這裏指定部分是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 =假工作)當我這樣做的方法:
# 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
,但它並沒有幫助。我覺得缺乏這方面的範圍知識。 你有什麼想法嗎?提前致謝。
如果你有很多商店,你爲什麼使用單件商店代替多個商店實例? – 2013-03-09 03:55:28
@AndrewMarshall,因爲應用程序不知道有其他商店。它只需要訪問店鋪特定的設置,例如它是Settingslogic子類的常規設置模型。 唯一的區別是我根據'request.domain'加載了不同的設置文件部分。 – 2013-03-09 11:01:40
@AndrewMarshall謝謝。當我意識到什麼是問題時,您的回答幫助我意識到我需要每個請求都有一個新的Shop實例。 – 2013-03-09 11:30:22