既然你說你只是想這樣做的意見,那麼它給我的印象是一個視圖助手將是值得考慮的:
# view.html.haml
= value_for_view(:phone, @project)
# application_helper.rb
def value_for_view(attribute, object)
if overide_attributes_in_view? && object.respond_to?("#{attribute}_for_view")
object.send("#{attribute}_for_view")
else
object.send(attribute)
end
end
# application.rb
def overide_attributes_in_view?
#do your stuff here to determine whether the original values should be shown or the 'overloads'
end
# project.rb
def phone_for_view
nil # just add methods called "attribute_for_view" for whatever attributes you want to whatever models you want to have the attributes 'overloaded' (it's not really overloading, but it serves the purpose you describe)
end
或類似的...你可以修補AR :: Base的有一個「value_for_view」的方法,這樣的觀點看起來更像是這樣的:
# view.html.haml
= @project.value_for_view(:phone)
# monkey_patch_file.rb
def value_for_view(attribute)
if respond_to?("#{attribute}_for_view")
send("#{attribute}_for_view")
else
send(attribute)
end
end
如果你堅持只要能夠調用@project.phone並獲得一個或其他值,就需要通過@project一個標誌來告訴它爲你做計算,因爲Rovermicroer的答案顯示(雖然,正如我所評論的,我不確定'超級'會起作用,但原則是正確的)。
您是否試圖在視圖中隱藏電話號碼,或者您是否試圖從業務邏輯中隱藏這些實例具有這些特定屬性的事實? –
我不確定實現該目標的最佳方式,但是您能告訴我們爲什麼需要此功能嗎?例如,是否阻止某些用戶訪問某些列? –
是的,我們將在視圖中使用該方法。這個想法並沒有改變任何東西,並且仍然在使用,例如<%= @ project.phone%>。當@ project.phone被調用時,如果用戶訪問規則如此說明,覆蓋方法將會啓動並返回空。這與隱藏一個領域類似。 – user938363