0

我知道模型不應該知道會話數據,但我需要訪問模型中定義的method_missing中的一小部分狀態信息。通過method_missing的抓方法由形式助手調用,即:訪問模型中method_missing會話的最佳方法

client_medias/new.haml: 
    f.text_field :new_display_name 

client_media.rb: 
    has_many :custom_properties, :as => :extensible 

這裏new_display_name'是通過一個多態關聯定義的自定義屬性鍵。我需要知道上下文(在我的情況下,由控制器中可訪問的current_app方法提供)來獲取我映射到method_missing中的動態方法定義的不同定製屬性鍵的集合。

任何想法?我查看了Thread.current,並且現在傾向於使用它。

+0

有很多在這個網站上討論這個問題的線程,多數會罵你甚至考慮它。有一種方法可以詳細解釋如何爲模型提供任何可用的東西,但需要警告,語言很粗糙,你覺得它是一個真正的工具。但它可以做到,這只是不好的做法。搜索'會話模型軌' – RadBrad 2012-04-26 23:13:51

+0

我已經在這裏和更廣泛的interwebs上做了我的研究。我意識到這是一個壞主意,但唯一的方法(我可以想到)直接將app_id從控制器傳遞給模型中的method_missing將是monkeypatch text_field助手,這本身可能是一個壞主意。如果有人能想出一個更好的主意,我會很樂意使用它。或者告訴我哪一個是較小的邪惡(monkeypatching助手或使用Thread.current)? – egres 2012-04-26 23:21:47

回答

0

我們有一個類似的問題,我們在單個應用程序中處理多個命令。在我們的例子中,上下文是通過用戶從中加載站點的頂級域標識的上下文。

我們的方法是使用I18n中的邏輯提供我們可以在應用程序的每個部分訪問的「單例」,就像使用Thread.currentI18n.locale一樣。

然後我們在應用程序控制器中設置單例作爲之前的過濾器,以便應用程序的其他每個部分都可以在相同的響應中使用它。

爲起點,看看斯文福克斯實現https://github.com/svenfuchs/i18n/blob/master/lib/i18n.rb

+0

我創建了一個基於我們的方法這個叫做whitelabel的小寶石:https://github.com/phoet/whitelabel – phoet 2012-06-18 10:31:17