Rails 3.2.2 с вкладками Twitter Bootstrap Ajax не работает

У меня второе приложение с Rails, и я хочу, чтобы ajax работал. Я также использую вкладки из bootstrap 2. Есть два варианта вкладок для начальной загрузки, которые я нашел, один дает вам вкладки, и вы можете поместить содержимое этих вкладок в DIV, другой - в основном каждая вкладка, которую вы можете использовать ссылку. Я выбрал последнее, чтобы иметь возможность Ajaxify ссылки. Основная идея заключается в том, что на домашней странице моих приложений вверху есть вкладки, такие как: «Главная», «Инвентаризация», «Задачи» и т. д., и когда вы нажимаете на вкладку, вы попадаете на индексную страницу каждого из этих контроллеров. У меня это работает отлично, пока я не попытаюсь использовать ajax для загрузки действия индекса для каждого контроллера/вкладки. Поэтому в качестве примера я буду использовать только вкладку/контроллер Home:

Домашний контроллер

class HomeController < ApplicationController

  def index
    @data = "Home Screen Index Page"
    respond_to do |format|
      format.html
      format.js
    end
  end
end

Вот ссылка на мой взгляд (app/views/layouts/application.html.erb):

link_to "Home", home_path(:format => :js), :remote => true

Я также только что попробовал:

link_to "Home", home_path, :remote => true

Мое действие с индексом на данный момент простое (/app/views/home/index.html.erb):

<%= @data %>

Я создал файл home.js.erb, который был в основном просто предупреждением, потому что он никогда не обрабатывается (я переименовал и даже удалил файл без изменений в сообщениях консоли), и как только предупреждение действительно срабатывает для меня, я могу сосредоточиться на jquery код: у меня было следующее в свое время:

$("<%= escape_javascript render(:file => 'home/index.html.erb') %>").insertAfter('.showindex');

При просмотре консоли, когда я щелкнул ссылку с вкладкой, я вижу следующее:

Started GET "/home.js" for 127.0.0.1 at 2012-03-19 18:15:21 -0700
Processing by HomeController#index as JS
  Rendered home/index.html.haml within layouts/application (0.1ms)
Completed 200 OK in 8ms (Views: 7.4ms | ActiveRecord: 0.0ms)

если я удалю (:format => :js) из ссылки, сообщение консоли немного изменится на следующее:

Started GET "/home" for 127.0.0.1 at 2012-03-19 18:16:59 -0700
Processing by HomeController#index as JS
  Rendered home/index.html.haml within layouts/application (0.1ms)
Completed 200 OK in 7ms (Views: 7.2ms | ActiveRecord: 0.0ms)

Глядя на консольное сообщение, в моей голове это должно работать, но это не так. Ничего никогда не отображается, и фактически функция TAB для вкладки «Главная» в начальной загрузке больше не работает.

Поскольку последние пару дней у меня ничего не получалось, и кажется, что это не должно быть так сложно, я уверен, что совершаю ошибку новичка. Если кто-то может помочь, я был бы очень признателен.

Спасибо!


person Charlie May    schedule 20.03.2012    source источник
comment
Я нашел несколько вещей. Во-первых, правильный код link_to: link_to "Home", home_path(:format => :js), :remote => true, и у меня неправильно назван файл js. Его нужно было назвать в честь действия в контроллере, поэтому вместо home.js.erb его нужно было назвать index.js.erb. После этого срабатывает действие предупреждения. Проблема, с которой я столкнулся сейчас, заключается в том, что когда я помещаю $("<%= escape_javascript render(:file => 'home/index.html.erb') %>").insertAfter('.showindex'); в файл js, код отображается в представлении вместо home/index.html.   -  person Charlie May    schedule 20.03.2012
comment
Проигнорируйте комментарий выше, я отвечу на свой вопрос ниже   -  person Charlie May    schedule 20.03.2012
comment
Куда вы положили файл js? В активах? Тогда как вызов просто «index.js.erb» связывает его с действием индекса домашнего контроллера?   -  person pitosalas    schedule 01.09.2012


Ответы (2)


Хорошо, я понял это. Правильный код link_to:

=link_to "Home", home_path(:format => :js), :remote => true, 'data-toggle' => 'tab'

И мне нужно было назвать файл js после действия в контроллере, а не самого контроллера. Поэтому вместо того, чтобы называть его home.js, мне нужно было назвать его index.js, и это сработало.

Я также заметил одну вещь: если бы я назвал его index.js.erb, он фактически отображал бы код jquery, а не выполнял его. Однако он выполнит предупреждение. В любом случае, имя файла просто index.js помогло. Вот окончательный результат для файла index.js:

$('.indexcontent').empty()
$('.indexcontent').append("<%= escape_javascript render(:file => 'home/index', :formats => [:html]) %>");
person Charlie May    schedule 20.03.2012
comment
чтобы избежать дополнительных шагов, вы можете просто использовать $('.indexcontent').html() вместо пустого, добавить - person Mike; 12.05.2012

Bootstrap не будет отображать содержимое выбранной вкладки, если вы не установите «цель данных».

=link_to "Home", home_path(:format => :js), :remote => true, 'data-toggle' => 'tab', 'data-target' => '#indexcontent'


<div class="tab-content">
    <div class="tab-pane" id="indexcontent">
    </div>
</div>
person carlosvini    schedule 13.06.2013