Rails在Helper中渲染部分

时间:2013-09-13 07:34:00

标签: ruby-on-rails ruby ruby-on-rails-3.2

我一直试图在我的控制器中的辅助函数中渲染我的一个部分。

我遇到的第一个问题是帮助程序返回每个循环而不是循环结果。为了解决这个问题,我尝试让它返回一个包含循环结果的字符串。

def display_replies(comment)
    if comment.replies.count > 0
        string = ""
        comment.replies.each do |reply, index|
        string = string + (render partial: "comment", locals: {index: index}).to_s.html_safe
        end
        string
    end

使用<%= display_replies(reply) %>

在视图中调用

当我查看我的视图时,返回并显示的内容是HTML,但它是转义的,因此是纯文本,它看起来像这样:

["<div class='c comment'>\n<div class='profile'>\n<img src='/assets/profile_image_sample.jpg'>\n</div>\n<div class='message'>\n<div class='username'>Will Leach</div>\nLorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus adipiscing purus et mi aliquet malesuada. Curabitur porttitor varius turpis eget sollicitudin. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Ut dapibus consectetur tortor, nec aliquet lacus tempus vitae. Sed felis massa, dapibus in arcu sit amet, rhoncus condimentum eros. Etiam rutrum lectus in malesuada aliquam. Mauris vitae diam vel felis accumsan vulputate vel nec tortor. Nunc pretium hendrerit est, ut cursus ipsum commodo sit amet.\n<div class='reply-link'>\n<a href='#'>Reply to Comment</a>\n</div>\n</div>\n</div>\n"]

我希望这是常规的非转义HTML。我在某处读到添加html_safe会解决这个问题,但是它没有。

从哪里开始?

3 个答案:

答案 0 :(得分:6)

实际上,html_safe应该像这样使用: -

<%= display_replies(reply).html_safe %>

答案 1 :(得分:1)

要修复\n[",我们需要在循环后设置.join。像这样:

助手:

def display_replies(comment)
  if comment.replies.count > 0
    raw(
      comment.replies.map do |reply, index|
        render 'comment', index: index
      end.join
    )
  end
end

查看:

<%= display_replies(reply) %>

请注意,我删除了所有html_safe并替换为raw。而不是each循环,我使用map,因此我们不必创建变量string并在循环后返回它。

希望这有帮助!

答案 2 :(得分:0)

您可以像这样使用html_safe方法

<%= html_safe display_replies(reply) %>