具有两种不同格式的渲染属性

时间:2019-03-01 23:03:57

标签: ruby-on-rails

在过去的几年中,我有一个具有使用降价语言的属性的对象,最近该属性现在切换为使用html。如何使用标记语言呈现所有过去的广告系列描述,以及如何使用.html_safe

呈现所有新的广告系列描述

Html_safe

<h6 class="text-muted" itemprop="description">
    <%= @campaign.product_description.html_safe %>
</h6>

降价

<h6 class="text-muted" itemprop="description">
  <%= Campaign::Format @campaign.product_description, {render_html: true} %>
</h6>

如何同时渲染两者?这样,对于所有旧广告系列,它将呈现标记,而对于新广告系列,则将呈现html。当我在同一行中包含html_safe和markdown时,它仅执行标记,而不执行WYSIWYG编辑器中的html。

2 个答案:

答案 0 :(得分:1)

几个选项:

  1. 为广告系列添加标志。类似于uses_html_description。相应地设置其值。并在视图中打开它。
  2. 进行数据迁移,并将所有旧格式的描述替换为新的html格式。

在这两者之间,我会选择后者。

答案 1 :(得分:1)

我首先想到的是,我将回填数据库,将所有旧记录转换为新格式。

否则,请在app/helpers/application_helper.rb中创建如下视图帮助器方法:

def description_text campaign
  if campaign.created_at > Time.new(2019,3,1).in_time_zone
    campaign.product_description.html_safe
  else
    Campaign::Format campaign.product_description, {render_html: true}
  end
end

请注意,如果您更喜欢基于时间的内容,也可以实际上检测字符串中的HTML,例如:

def description_text text
  if text.starts_with? "<html" # or whatever
    # ...