2013-09-13 2 views
4

Я пытаюсь отобразить один из моих партикулов в вспомогательной функции, расположенной в моем контроллере.Rails Render Partial in Helper

Первая проблема, с которой я столкнулся, заключалась в том, что помощник возвращал каждый цикл вместо результата цикла. Чтобы исправить это, я попытался вернуть строку, содержащую результаты цикла.

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 

Вызывается в View с <%= 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 исправит это, но, увы, этого не произошло.

Куда пойти отсюда?

+0

Как мета-ответ, это не то, как вы должны использовать помощника. Помощник не должен знать базовые шаблоны или данные, которые он использует. Вы должны использовать частичную часть, чтобы перебирать ответы и использовать 'render partial:' в ваших шаблонах. –

+0

Мне нужно, чтобы это была рекурсия, и я не думаю, что могу получить это с помощью блоков? Мне нужна функция, чтобы позвонить себе, чтобы узнать, имеет ли ответ какой-либо ответ, и ответ на этот ответ и т. Д.? Можно ли это сделать с частичным? – Melbourne2991

ответ

6

На самом деле, html_safe следует использовать так: -

<%= display_replies(reply).html_safe %> 
+0

Хорошо, так что это делает HTML отлично, однако я все еще остаюсь со многими '\ n' – Melbourne2991

+0

?? ваш комментарий? – techvineet

+0

html визуализируется, но строка '\ n' остается и не преобразуется в новую строку – Melbourne2991

1

Чтобы исправить \n и [", мы должны иметь .join после цикла , Как так:

Helper:

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 и возвращать ее после цикла.

Надеюсь, это поможет!