помещая <% = yield%> в частичное для вызовов jjery ajax - PullRequest
1 голос
/ 01 января 2011

Я пытаюсь сделать ссылку "home" в моем <%= render 'layouts/header' %> вызове ajax / jquery, чтобы изменить <%= yield %> в части внутри моего содержимого div. все, что я получаю, это пробелы в представлении .. <%= yield %> отлично работает, если поместить в частичное без ajax, но при использовании ajax ничего не отображается ... разве yield нельзя использовать таким образом?

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

мой файл application.html.erb выглядит так:

<head>
$(function() {
  $("#home").live("click", function() {
    $.get(this.href, null, null, "script");
  return false; }); });
</head>
<body>
  <div id="container">
    <%= render 'layouts/header' %>
    <div id="content">
      <%= render 'layouts/content' %>
    </div>
    <%= render 'layouts/footer' %>
  </div>
</body>

my <%= render 'layouts/header' %> содержит:

<%= link_to "Home", root_path, :id => "home" %>

my <%= render 'layouts/content' %> содержит только:

<%= yield %>

home.js.erb

$("#content").html("<%= escape_javascript(render("layouts/content")) %>");

Ответы [ 2 ]

2 голосов
/ 01 августа 2012

Ваш случай использования точно решен rails-ajax gem.

Все, что вам нужно сделать, это настроить его на div#content в качестве основного контейнера по умолчанию, и ваш сайт будет автоматически изменен с помощью этого контейнера. Нет необходимости изменять код вашего приложения.

Он доставляет вам много хлопот: закладки, история, выполнение скриптов, перенаправления, формы, откат для браузеров с отключенной JS ...

Вы также можете указать дополнительные партиалы, которые будут обновляться при действиях некоторых конкретных контроллеров.

1 голос
/ 01 января 2011

В home.js.erb вы визуализируете пустой файл макета. Попробуйте вместо этого отрисовать какой-нибудь вид.

Вы можете думать о <%= yield %> как о заполнителе для визуализированного содержимого представления в файле макета. Если вы визуализируете только макет, там нечего вставлять.

http://guides.rubyonrails.org/layouts_and_rendering.html#understanding-yield

Альтернативное решение

Добавьте это в начало вашего контроллера, чтобы отключить макеты для запросов ajax:

layout Proc.new { |controller| controller.request.xhr? ? false : 'application' }

Это сделает все ссылки внутри #header загруженными с помощью ajax и поместит результат в #content div:

$(function() {
    $('#header a').live('click', function() {
        $('#content').load(this.href);
        return false;
    });
});

Удалите формат js из действий вашего контроллера, потому что он больше не нужен.

...