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"
в вашем действии индекса рендеринг без макета:
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');