В моем случае у меня была та же самая проблема в течение полутора дней, и после того, как я попробовал много комбинаций escape_javascript, to_json, render ... content_type и т. Д., Я наконец достиг того, что искал, то есть рендерингаЧастичное HTML в ответе json.
Итак, в вашем контроллере есть действие типа
def index
@candidatos = Candidatos::Base.paginate(page: params[:page], per_page: 3).to_a
respond_to do |format|
format.html # index.html.erb
format.json # index.json.erb
end
end
, и если запрос имеет .json, он будет использовать шаблон index.json.erb,и в моем случае этот шаблон выглядит примерно так:
<% self.formats = ["html"] %>
{
"html":<%= thumbnails_tag(@candidatos).to_json.html_safe %>
}
Обратите внимание, что self.formats = ["html"]
необходимо, потому что в противном случае «представление» не найдет частичное, потому что оно будет искать частичное .json.и что более важно, не используйте escape_javascript, потому что он заполнит HTML с \ t и \ n.Другими словами, идея состоит в том, чтобы передать вывод вашего партиала в .to_json, а затем в .html_safe .
thumbnails_tag
- это просто помощник, который я создал, потому что я используючастично во многих частях приложения, но в основном оно имеет что-то вроде
def thumbnails_tag objs
#Uncomment the line below to test when no much data available
# @listas.fill(@listas.first, 0..6)
thumb_span = 4
case @candidatos.length
when 1..3
thumb_span = 12 / @candidatos.length
else
thumb_span = 4
end
thumbs = {span: thumb_span}
render partial: 'candidatos/thumbnails', locals: {candidatos: @candidatos, thumbnail_options: thumbs }
end
Наконец, и в качестве примера, с этим подходом, в ваших .js активах вы можете сделать что-то вроде:
$.get('http://localhost:3000/candidatos.json?page=2', function(d){}, 'json')
.success(function(d){
$('#presidentes div.row-fluid .thumbnails').parent().append(d.html);
})
.error(function(event,error){
console.log(error);
})
Нет необходимости использовать gsub для \ t и \ n в вашем представлении rails или в строке JSON.parse в вашем Javascript.