2011-06-07 32 views
6

我有一個名爲Feature的模型,其中包含一個名爲body_string的變量,其中包含我想呈現的HTML標記,而不是轉義。有沒有什麼方法可以像html_safe一樣定義模型的屬性?

在我的意見中,每當我參考body_string時,我需要使用<%=raw.html_safe。這看起來多餘而且不太乾。

有沒有什麼辦法可以一勞永逸的建立body_string變量爲html_safe

我假設這會發生在app/models/feature.rb文件中,但我無法弄清楚正確的語法會是什麼。我想到了這個:

def body_string 
    return self.body_string.html_safe 
end 

但Rails不喜歡它;它會引發一個stack level too deep異常。

當然,我可以定義一個變量/方法有不同的名稱:

def safe_body_string 
    return self.body_string.html_safe 
end 

然後就是改變從body_stringsafe_body_string在視圖中的所有引用。但不知怎的,這看起來幾乎與未使用乾淨一樣簡單地使用raw.html_safe擺在首位。

任何見解如何最好地處理這個?我覺得我必須有一些非常優雅的東西,我只是沒有看到。

+4

無論DRY(只有3個字符),您應該每次輸出'body_string'都使用'raw'。當你打算輸出未經編碼的HTML時,你有被迫非常明確的原因,開發人員希望*看到*你是明確的。您將顯示邏輯有效地轉移到模型中,並且讓那些正在將原始HTML發送到瀏覽器的人看到您的視圖時不那麼明顯。 – meagar 2011-06-07 17:54:14

+0

我很遺憾,我只有一個upvote給予@ meagar的評論 – Simon 2011-06-07 18:12:30

回答

9

只需使用read_attribute避免遞歸調用body_string

def body_string 
    read_attribute(:body_string).html_safe 
end 

read_attributewrite_attribute從模型中設置屬性補充。

關於樣式的說明:除非實際需要,否則請勿使用明確的return。方法中最後一條語句的結果隱含地是從方法返回的值。

+1

我會改爲read_attribute(:body_string).try(:html_safe),所以它不會拋出錯誤,當屬性爲零 – 2014-09-25 18:22:00

0

或者你也可以用這個辦法,

def body_string 
    super && super.html_safe 
end 
1

雖然@微薄的答案肯定會的工作,我不認爲這個邏輯模型中的所屬。僅僅是因爲它向模型層添加了視圖級關注(HTML安全性),應該只包含業務邏輯。相反,我會建議使用一個演示者爲此(請參閱http://nithinbekal.com/posts/rails-presenters/或找到一個寶石 - 我個人喜歡Display Case)。您的演示者可以輕鬆覆蓋body_string方法,並在視圖中顯示時提供.html_safe指定。通過這種方式,您可以將您的疑慮分開,並可以繼續從其他模型中獲得body_string,而不會混淆視圖。

相關問題