2013-10-22 81 views
0

我有我想要做的條件驗證像這樣一類用戶之前運行的方法:一類負荷

if $organization.first_name_last_name 
    validates :name_first, presence: true, 
        length:  { maximum: 50 }, 
        :if => :local_authentication? 
    validates :name_last, presence: true, 
        length:  { maximum: 50 }, 
        :if => :local_authentication? 

但是這個全球性組織變量是包含特定設置的子域的對象,並進行初始化在應用程序控制器的before_filter中。

class ApplicationController < ActionController::Base 
    before_filter :load_organization 
    ... 
    def load_organization 
     $organization = Organization.find_by_subdomain(request.subdomain).settings 
    end 

我的問題是如何使load_organization在User類加載之前運行,以便正確設置組織變量。

回答

1

沒有辦法,這可以工作,因爲用戶類沒有請求之間重載,至少不是在生產。

您已經使用了驗證:if參數。您也可以將其用於設置:

validates :names_first, presence: true, 
         if: -> { 
          $organization.first_name_last_name && 
          local_authentication? 
         } 

順便說一句:使用全局變量通常是軟件設計不好的標誌。您嘗試創建/更新它所屬的組織的用戶是否不正確?您是否可以通過關係getter訪問設置?

P.S:你是混合哈希語法,以及。您應該使用:foo => :barfoo: :bar,但不能同時在同一時間。其實我很驚訝這在所有工作;)

+0

感謝您的回答!這解決了它。 我使用的公寓寶石(https://github.com/influitive/apartment),其允許通過不同的數據庫依賴於子域來處理每個請求。在第一次嘗試啓用多租戶時,我爲每個實例創建了一個獨立的組織對象來保存配置參數(取決於客戶端的需求)。這只是一個臨時解決方案 – rtemperv