11

从 JavaScript 中,我通过 AJAX 调用控制器,如下所示:

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

在我的控制器中,我有:

def index
  render 'lightbox.js.erb'
end

在我的路线中,我有:

resources :books do
  member do
    get :lightbox
  end
end

在 lightbox.js.erb 我有:

alert("Hello world!");

由于某种原因,警报永远不会被调用。无论是通过服务器还是通过 Firebug,我都没有收到任何错误消息。我不知道可能出了什么问题。有任何想法吗?

4

7 回答 7

27

事实证明,在客户端,我的 JavaScript 被呈现为文本。我通过查看控制台提要确认了这一点。它说:

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

最后两个词应该读作“as JS”。在扎根之后,我发现这篇博客文章导致了一个非常简单的解决方案。在 AJAX 调用中添加“dataType: script”:

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

谢谢大家的帮助!

于 2012-08-03T16:03:55.550 回答
7

我认为那是因为您需要致电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 调用的响应

于 2012-08-02T23:36:31.490 回答
1

您可以尝试使用此脚本在 java 脚本中调用您的操作

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"
于 2012-08-03T00:04:01.197 回答
0

尝试将此添加到控制器:

respond_to :js
于 2012-08-03T04:53:10.933 回答
0

我在 link_to helper 上遇到了类似的问题,但已使用以下方法进行了更正remote:true

于 2017-11-06T21:15:20.387 回答
0

对于任何偶然发现这一点并且只想调用以js.erb文件响应的控制器操作的人,我已经通过这种方式实现了它(在Anthony Alberto 的 Awesome Answer的帮助下)。

控制器动作

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

some_action.js.erb

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

阿贾克斯调用

var id = '<%= @someresource.id %>';
$.get('/someresource/' + id + '/action/', null, function(data){
    eval(data)
}, 'script');
于 2017-10-19T23:17:36.570 回答
0

在你的 index 动作中,不使用布局渲染:</p>

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

这对我来说是工作。

于 2016-05-28T11:28:17.097 回答