Rails: рендеринг js.erb через вызов AJAX

из JavaScript я вызываю контроллер через AJAX следующим образом:

$.ajax({
  type: 'GET',
  url: '/books'
}

в моем контроллере у меня есть:

def index
  render 'lightbox.js.erb'
end

в моих маршрутах у меня есть:

resources :books do
  member do
    get :lightbox
  end
end

в lighbox.js.Эрб у меня:

alert("Hello world!");

Почему-то оповещение не вызывают. Я не получаю сообщений об ошибках ни через сервер, ни через Firebug. Я не понимаю, что может пойти не так. Есть идеи?

7 ответов


оказывается, что на стороне клиента мой JavaScript отображался как текст. Я подтвердил это, посмотрев на ленту консоли. Он сказал:"!--3-->

Started GET "/books/lightbox?book=4&username=tbaron&_=1344009191129" for 127.0.0.1 at 2012-08-03 10:53:11 -0500
Processing by BooksController#lightbox as text

последние два слова должны были читать "как JS.- Покопавшись, я нашел вот это!--5-->блоге что привело к удивительно простому решению. Добавьте" dataType: script " в вызов AJAX:

$.ajax({
  type: 'GET',
  url: '/books'
  dataType : 'script'
}

Спасибо за вашу помощь, все!


Я думаю, это потому, что вам нужно позвонить books.js :

$.ajax({
  type: 'GET',
  url: '/books.js',
  success: function(data) {
    eval(data);
  }
}

в акции индекса :

def index
  respond_to do |format|
    format.js { render 'lightbox'}
  end
end

и lightbox.js.erb должно быть в app / views / books

если он все еще не работает, попробуйте позвонить books/index.js Вы также можете использовать firebug / chrome, чтобы проверить, что сервер отвечает на ваш вызов ajax


вы можете попробовать этот скрипт для вызова вашего действия в Java script

var post_params = {};
var action = '/books/script_action';

$.post(action, post_params).success(function (data) {

     eval(data);

}).error(function (data) {

    alert("Erro to call a action controller");

});

и в вашем контроллере попробуйте это. Предлагаю создать новое действие

def script_action
  render 'lightbox.js'
end

в маршрутах файл:

match "books/script_action/" => "books#script_action"

попробуйте добавить это к контроллеру:

respond_to :js

в вашем действии индекса рендеринг без макета:

def index
  respond_to do |format|
  format.js { render 'lightbox', layout: false}
end

это работает для меня.


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

Действие Контроллера

def some_action
  ..
  respond_to do |format|
    format.js { render 'some_action' }
  end
end

some_action.js.Эрб

...
$('#someActionWrap').html('<%= j render "some/displaypartials/action_partial" %>')
...

Ajax call

var id = '<%= @someresource.id %>';
$.get('/someresource/' + id + '/action/', null, function(data){
    eval(data)
}, 'script');

У меня есть аналогичная проблема на link_to helper, но это было исправлено с помощью remote:true