表中的嵌套content_tag无法转义html

时间:2013-01-03 04:59:25

标签: ruby-on-rails view

我在Rails3中创建了一个Presenter,并且遇到嵌套内容标记的问题。代码摘录如下:

def lesson_activity_row
  lesson.activities.collect do |lesson_activity|
    content_tag :tr do 
      concat(content_tag :td, lesson_activity.activity
      concat(content_tag :td, lesson_activity.duration
      concat(content_tag :td, lesson_activity.agent
     end
   end
end

在我看来,我得到以下内容:

["<tr><td>New Activity</td><td>5 Minutes</td><td>Teacher</td></tr>", "<tr><td>New Activity</td><td>5 Minutes</td><td>Teacher</td></tr>"]

1 个答案:

答案 0 :(得分:1)

正如我所看到的那样,我找不到任何好的答案,为什么这不起作用,看到一系列问题没有得到答复或者没有为我工作。因此,在查看了我可用于Arrays和ActiveSupport :: SafeBuffer的方法之后,我想出了以下工作:

def lesson_activity_row
  lesson.activities.collect do |lesson_activity|
    content_tag :tr do 
      concat(content_tag :td, lesson_activity.activity
      concat(content_tag :td, lesson_activity.duration
      concat(content_tag :td, lesson_activity.agent
     end.to_s #note the to_s
   end.join.html_safe #note join.html_safe
end

我看到的许多解决方案包括使用"joins",但这里的content_tag没有返回数组。它返回ActiveSupport::SafeBuffer的实例,而#join不是该对象的方法。然而,to_s是。

当然,这个content_tag嵌套在lesson.activities.collect内,这是一个数组,当然,#join是一个可以在Array上调用的方法。并且#html_safe逃脱了html。

希望这有助于其他人!