如何从字符串中的占位符呈现变量

时间:2013-10-02 08:54:10

标签: ruby-on-rails ruby liquid

我正在创建一些消息建议,用户可以单击该建议来填充文本区域。显示时,通用字符串必须使用用户的详细信息进行渲染。

这是我想要做的,但是此示例使用未从数据库中提取的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 %>

我试图在呈现之前将ruby代码添加到视图中。可能是一个愚蠢的想法。

这是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>

3 个答案:

答案 0 :(得分:2)

您尝试将一组模板存储在数据库中,然后将这些模板呈现给您的视图。

你应该使用Liquid

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>

答案 1 :(得分: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) }
如果在nil上调用,

try 将返回nil。

如果html输出仍然被转义,请尝试以下方法之一:

raw(expression)
expression.html_safe

答案 2 :(得分: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"