Rails: рендеринг Partials через Ajax - PullRequest
6 голосов
/ 02 марта 2012

У меня есть страница с вкладками, и я хочу просто визуализировать различные партиалы через ajax при нажатии на вкладки. У меня есть код, но я не думаю, что это самый эффективный способ. Я надеялся, что кто-нибудь может мне помочь с моим кодом, который уже есть, или если есть более простой метод, я был бы очень признателен. Спасибо!

Вкладка HTML

<li class='StreamTab StreamTabRecent active'>
<%= link_to 'Most Recent', mostrecent_schools_path, :remote => true, :class => 'TabText' %>
</li>


<div id='ContentBody'>
<div id='ajax'></div>
<%= render 'users/microposts', :microposts => @microposts %>
</div>

Школьный контролер

class SchoolsController < ApplicationController  
  def mostrecent
    @school = School.find_by_slug(request.url.gsub('http://localhost:3000/','')).id
    @microposts = @user.microposts.order('created_at DESC').paginate(:per_page => 3, :page => params[:page])
     respond_to do |format|
      format.html
      format.js
     end
  end
end

Самый последний JS

$("#ContentBody").html('<%= escape_javascript(render :partial => "users/microposts" )%>');

Маршруты

  resources :schools do
    collection do
        get :mostrecent
    end
  end

Ответы [ 3 ]

10 голосов
/ 02 марта 2012

Смотрите мой ответ на предыдущий пост.Это даст вам представление AJAX в Rails: Показать модель # новую форму после завершения модели # update

Что вы можете сделать, это визуализировать json в действии и передать партиал как json.

def mostrecent
  @school = School.find_by_slug(request.url.gsub('http://localhost:3000/','')).id
  @microposts = @user.microposts.order('created_at DESC').paginate(:per_page => 3, :page => params[:page])
  respond_to do |format|
    format.json { render :json => {:success => true, :html => (render_to_string 'users/microposts')} }
    format.html { }
  end
end

Вы можете получить доступ к json в вашем js (то есть в файле javascript / coffeescript, таком как mostrecent.js или mostrecent.js.coffee) и заменить текущий элемент.

$('.TabText').live 'ajax:success', (event,data) ->
  $('#ContentBody').html(data.html) if(data.success == true)
2 голосов
/ 03 декабря 2013

Ответ Прасвина точен. Возврат и выполнение JS может показаться простым, но это значительно усложняет отладку - как установить точку останова в JS, которая была возвращена через AJAX? Вместо этого вы должны включить все свои JS на страницу и отправлять только данные обратно.

0 голосов
/ 19 января 2016

Я использую рельсы 4.2 и ответ @prasvin указал мне правильное направление, но когда я использовал

format.json { render :json => {:success => true, :html => (render_to_string 'instruments')} }

Я бы получил сообщение об ошибке "Отсутствует шаблон ... инструменты ..."

После прочтения я нашел этот комментарий rails render_to_string, выдающий ошибки с частичным представлением . @marcel упомянул, что вам нужно указать, что файл является частичным, частичным: 'instruments', как показано ниже:

format.json { render :json => {:success => true, :html => (render_to_string partial: 'instruments')} }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...