2014-07-22 75 views
0

我有我Postscontent列。我插入Posts表中Post模型如何從字符串Rails執行代碼並進行渲染?

Post.create({content: "<%= link_to('post', post_path) %> blah blah ... "}) 

一些信息,當我想重新返回到@post.content我收到"<%= link_to('post', post_path) %> blah blah ..."沒有串執行。

如何渲染它的權利?

+1

你做你想做偏離航向什麼:)但我要告訴你,在你的數據庫中存儲的可執行代碼是不是在長期 – Benj

+0

一個好主意,正如本雅明所說,這是一個壞主意,短期和長期的。坦率地說,我甚至不確定你會怎樣做到這一點。如果你放棄外部的ERB括號並在字符串上使用'eval',它可能會起作用。但是,如果您的意圖是渲染僅針對一個或幾個對象的東西,那麼將其構建到模型或查看模板本身會更好,更容易。 –

+0

@ user1538633爲什麼不將字符串存儲在文本列而不是代碼中? – ant

回答

1

所以,說這是一個非常錯誤的想法,在數據庫中存儲的代碼。這種情況幾乎沒有例外,實施起來非常複雜,容易出錯,並且存在安全問題。總之:不要這樣做。

所以你需要一個替代設計。基本上有3種情況,拿起與你的應用程序的目標相對應的一個:

-如果你的方法參數和輸出將來不會改變,那麼你執行你的代碼並將輸出存儲在保存之前,模型的緩存列(鍵入字符串或文本)。當檢索該緩存的輸出後,你可以只使用它,因爲它

post.cached_output = my_method(...) 
post.save 
# In the future, in your view: 
<%= post.cached_output %> 

B-如果你的方法的參數,絕不會在將來改變,但該方法根據輸出到外部元件,然後只儲存不同之處在於一個參數的值,並調用該方法每次需要時它的輸出

post.cached_parameter = 17 
post.save 
# In the future, in your view: 
<%= my_method(params: post.cached_parameter) %> 

C-如果你的方法的參數的變化隨着時間的推移,你的方法輸出也改變加班,那麼你不需要緩存內容的數據庫