rails — как визуализировать объект JSON в представлении

прямо сейчас я создаю массив и использую:

render :json => @comments

Это было бы хорошо для простого объекта JSON, но прямо сейчас моему объекту JSON требуется несколько помощников, которые ломают все и требуют включения помощников в контроллер, который, кажется, вызывает больше проблем, чем решает.

Итак, как я могу создать этот объект JSON в представлении, где мне не нужно беспокоиться о том, чтобы что-то сделать или что-то сломать при использовании помощника. Прямо сейчас то, как я делаю объект JSON в контроллере, выглядит примерно так? Помогите мне перенести его в представление :)

# Build the JSON Search Normalized Object
@comments = Array.new

@conversation_comments.each do |comment|
  @comments << {
    :id => comment.id,
    :level => comment.level,
    :content => html_format(comment.content),
    :parent_id => comment.parent_id,
    :user_id => comment.user_id,
    :created_at => comment.created_at
  }
end

render :json => @comments

Спасибо!


person AnApprentice    schedule 01.03.2011    source источник
comment
Немного смущает требуется несколько помощников, какие помощники, что делать?   -  person macarthy    schedule 02.03.2011
comment
html_format — это помощник, использующий simple_format и auto_link. Вот в чем вся беда.   -  person AnApprentice    schedule 02.03.2011
comment
Следуйте этим рекомендациям.   -  person Vicente Reig    schedule 02.03.2011


Ответы (3)


Я бы порекомендовал вам написать этот код в самом помощнике. Затем просто используйте метод .to_json для массива.

# application_helper.rb
def comments_as_json(comments)
  comments.collect do |comment|
    {
      :id => comment.id,
      :level => comment.level,
      :content => html_format(comment.content),
      :parent_id => comment.parent_id,
      :user_id => comment.user_id,
      :created_at => comment.created_at
    }
  end.to_json
end

# your_view.html.erb
<%= comments_as_json(@conversation_comments) %>
person Marcel Jackwerth    schedule 01.03.2011
comment
Подождите... Означает ли нахождение внутри помощника, что он может использовать такие вещи, как simple_format и т. д., без необходимости включения? - person AnApprentice; 02.03.2011
comment
Если бы я это сделал с тем, что html_format использует simple_format и auto_link, были бы проблемы? - person AnApprentice; 02.03.2011
comment
Я предполагаю, что вы уже нашли этот ответ самостоятельно, но да, вам не нужно явно включать других помощников в помощника. Примечание. Для этого требуется, чтобы ваш ApplicationController имел helper :all (по умолчанию). - person Marcel Jackwerth; 02.03.2011

Или используйте:

<%= raw(@comments.to_json) %> 

чтобы избежать любых символов кодировки html.

person JayCrossler    schedule 27.01.2013
comment
проверено и кажется безопасным, например. "</script><script>alert(1)</script> становится "\u003c/script\u003e\u003cscript\u003ealert(1)\u003c/script\u003e" - person Dorian; 14.12.2020

<%= @comments.to_json %>

тоже должен сделать трюк.

person Daniel Tsadok    schedule 01.03.2011