我正在创建一些消息建议,用户可以单击该建议来填充文本区域。显示时,通用字符串必须使用用户的详细信息进行渲染。
这是我想要做的,但是此示例使用未从数据库中提取的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源中显示的内容
<%= @user.name %> is the best
<%= #{@user.name} %> is the best
#{@user.name} is the best
这是类似的东西,但它附加的消息不起作用,因为变量位于每条消息的不同位置:
<ul>
<% @suggestions.each do |message| %>
<li><a><%= "#{@user.name} message" %></a></li>
<% end %>
</ul>
答案 0 :(得分:2)
您尝试将一组模板存储在数据库中,然后将这些模板呈现给您的视图。
你应该使用Liquid
示例摘录:
<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"