2013-10-02 82 views
0

我正在創建一些消息建議,用戶可以通過點擊來填充文本區域。顯示時,通用字符串必須使用用戶的詳細信息進行呈現。如何呈現字符串中佔位符的變量

這就是我想要做的,但這個例子中使用了不是牽強從數據庫中HTML編碼的消息:

<ul> 
    <li><a><%= "#{@user.name} is the best" %></a></li> 
    <li><a><%= "#{@user.name} is the worst" %></a></li> 
    <li><a><%= "I think #{@user.name} is the best" %></a></li> 
    <li><a><%= "I think #{@user.name} is the worst" %></a></li> 
</ul> 

我希望能夠廣義字符串存儲在一個「佔位符」數據庫並只計算視圖中的值。

這是怎麼了,我試圖在數據庫中創建的字符串(種子文件)

Suggestion.create(message: '#{@user.name} is the best') 
Suggestion.create(message: '<%= #{@user.name} %> is the best') 
Suggestion.create(message: '<%= @user.name %> is the best') 

在視圖中我有我嘗試的

<%= suggestion.message %> 

迭代在呈現之前將紅寶石代碼添加到視圖中。可能是一個愚蠢的想法。

這就是顯示在HTML源

&lt;%= @user.name %&gt; is the best 
&lt;%= #{@user.name} %&gt; is the best 
#{@user.name} is the best 

這是類似的東西,但它附加這將不會作爲變量的工作是在每個消息中不同的地方消息:

<ul> 
    <% @suggestions.each do |message| %> 
     <li><a><%= "#{@user.name} message" %></a></li> 
    <% end %> 
</ul> 
+0

您的看法可能是使用'.html'擴展名替換'.html.erb' –

+0

它使用.erb擴展名 – grabury

回答

2

您試圖將一組模板存儲在數據庫中,然後將這些模板呈現給您的視圖。

您應該使用液體

http://liquidmarkup.org/

例片段:

<ul id="products"> 
    {% for product in products %} 
    <li> 
     <h2>{{ product.title }}</h2> 
     Only {{ product.price | format_as_money }} 

     <p>{{ product.description | prettyprint | truncate: 200 }}</p> 

    </li> 
    {% endfor %} 
</ul> 

代碼來渲染

Liquid::Template.parse(template).render 'products' => Product.find(:all) 

你怎麼可以這樣做:

class Suggestion < AR::Base 
    validate :message, presence: true 

    def render_with(user) 
    Liquid::Template.parse(message).render user: user 
    end 
end 


Suggestion.create(message: "{{user.name}} is the best") 
Suggestion.create(message: "{{user.name}} is the worst") 
Suggestion.create(message: "{{user.name}} is the awesome") 

<ul> 
    <% Suggestion.all.each do |suggestion| %> 
    <li><%= suggestion.render_with(@user) %> 
    <% end %> 
</ul> 
+0

輝煌。謝謝!真的很感謝我的例子中如何使用液體的例子。我不得不添加:def to_liquid {'name'=> self.name}結束於用戶模型。 – grabury

1

不知道這是你想要的,但這裏有一些可能有效的解決方案時@user可能是nil

"#{@user.try(:name)} is the best in the biz" 
"%s is the best in the biz" % @user.try(:name) 
"#{name} is the best in the biz" % { name: @user.try(:name) } 

try如果在nil上調用將返回nil。

如果HTML輸出還是逃了出來,嘗試之一:

raw(expression) 
expression.html_safe 
0

如果你想顯示此消息爲每個用戶,那麼你應該讓一個方法調用:

class Suggestion < AR::Base 
    belongs_to :user 

    def default_message 
    "#{user.name} is the best" 
    end 
end 

@user  = User.new(name: "Bob") 
@suggestion = Suggestion.create(user: @user) 
@suggestion.default_message #=> "Bob is the best" 
+0

它不適用於種子文件,因爲它試圖插入字符串(並給出@user爲零的錯誤),當我想要它時存儲導軌代碼 – grabury

+0

更新了我的答案。 –

+0

我不希望它存儲每個用戶的計算值。這個想法是存儲消息的通用版本,以便在顯示時可以計算出來。 – grabury