Rails рендеринг частичного в JSON - PullRequest
0 голосов
/ 18 октября 2011

Я пытаюсь визуализировать частичное внутри файла JSON, чтобы я мог использовать его через AJAX. В настоящее время в моем файле JSON у меня есть:

<% self.formats = ["html"]%>
{
   "html": "<%= raw escape_javascript(render(:partial => 'shared/mini_posts', :locals => {:type => "left"}).to_json )%>"
}

Это в настоящее время не возвращает ответа, но мои журналы показывают, что shared / mini_posts был обработан.

Обратите внимание, что если я попробую что-то вроде:

{
   "html" : "test"
}

Возвращается правильно.

Мой jQuery выглядит так:

$j.ajax({
    url('/thepage.json'),
    dataType: 'json',
    success: function(data){
        console.log(data);
    }
})

Ответы [ 3 ]

1 голос
/ 22 марта 2013

В моем случае у меня была та же самая проблема в течение полутора дней, и после того, как я попробовал много комбинаций 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.

0 голосов
/ 18 октября 2011

Вам нужно сменить контроллер.В части response_to вам нужно добавить рендеринг json.Например:

respond_to do |format|
     format.json { render :json => @instancevar }
     ....
     ...
     ..
end

Затем вы можете просто добавить .json к вашему URL и вы получите данные, отформатированные как json.Что вам может понадобиться, это отключить корень JSON, который автоматически добавляется по умолчанию.Просто добавьте эту строку в конфигурацию вашей среды (development.rb, production.rb, ...):

config.active_record.include_root_in_json = false

Это важно, когда вы анализируете json.

0 голосов
/ 18 октября 2011

Вы не можете вызвать to_json по частям ... это метод ActiveRecord. Если вам нужен json, то он должен быть внутри партиала.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...