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 %>

我正在尝试在渲染之前将 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>
4

3 回答 3

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>
于 2013-10-02T14:25:09.923 回答
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
于 2013-10-02T13:01:01.300 回答
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"
于 2013-10-02T13:02:52.783 回答