2011-08-04 36 views
1

我有一個名爲Snippet的模型,其中包含HTML代碼片段以將其推入視圖。模型內部的Ruby元編程

該模型有一個列代碼和其他內容

我想寫這樣的事情在我看來,並獲得內容發回

<%= raw Snippet.PHONE_NUMBER %> 

其查找PHONE_NUMBER上的代碼,並返回內容

回答

1

Snippet類添加method_missing類方法如下

# Snippet class 
class << self 
    def method_missing(method, *args, &block) 
    if(snippet = Snippet.find_by_code(method.to_s)) 
     return snippet.content 
    else 
     return super(method, *args, &block) 
    end 
    end 
end 

這應該可以做到。

但是,在相關說明中,我不確定這樣做是否最好,因爲您的代碼依賴於數據庫中的數據。明天,電話號碼記錄被刪除,您的代碼Snippet.PHONE_NUMBER將中斷。這種方法有很多維護頭痛。

+0

非常感謝,代碼很好,作品很受歡迎。感謝您的額外建議,現在我的CMS用戶只是編輯內容,但是當我打開模板時,我需要重新考慮這一點。 – creativetechnologist

1

一個更簡潔的方法(這將避免元編程)將有你的觀點做這樣的事情:

<%= snippet :PHONE_NUMBER %> 

<%= snippet 'PHONE_NUMBER' %> 

其中snippet方法是一個輔助模塊,像這樣的定義:

module SnippetHelper 
    def snippet(code) 
    raw Snippet.find_by_code(code.to_s).content 
    end 
end 

並提供給所有您的意見與像這樣:

class ApplicationController < ApplicationController::Base 
    helper :snippet 
end 
0

或使用委託。

但它聽起來像是你提供了partials或helpers的另一個實現,或者decent_exposure和helpers和partials的組合。