【问题标题】:Rails: Rendering a js.erb through an AJAX callRails:通过 AJAX 调用渲染 js.erb
【发布时间】:2012-08-02 23:32:53
【问题描述】:

在 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.erb 我有:

alert("Hello world!");

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

【问题讨论】:

    标签: ruby-on-rails ajax


    【解决方案1】:

    事实证明,在客户端,我的 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”。在四处寻找之后,我发现了这个blog post,它带来了一个非常简单的解决方案。在 AJAX 调用中添加“dataType: script”:

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

    谢谢大家的帮助!

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 还是没有运气。此外,Firebug 确实显示服务器正在响应。我什至在 AJAX 中放了一个成功回调,它正在触发。
      • 您得到的回应是什么?
      • 我收到了我的代码作为响应。我想知道为什么它没有触发?
      • 我在 js.erb 中输入了纯废话,如果 Firebug 实际尝试处理代码,这通常会导致语法错误。我的猜测是由于某种原因它被作为文本阅读。我会解决这个问题,希望能解决一些问题。
      • 好的,我刚刚发现您实际上需要执行 JS……get 请求只会获取代码……并且什么都不做……我将编辑我的答案
      【解决方案3】:

      您可以尝试使用此脚本在 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"
      

      【讨论】:

        【解决方案4】:

        尝试将其添加到控制器中:

        respond_to :js
        

        【讨论】:

          【解决方案5】:

          在你的 index 动作中,无布局渲染:

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

          这对我有用。

          【讨论】:

            【解决方案6】:

            对于任何偶然发现这一点并只想调用一个控制器操作来响应js.erb 文件的人,我已经通过这种方式实现了它(在Anthony Alberto's 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" %>')
            ...
            

            Ajax 调用

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

            【讨论】:

              【解决方案7】:

              我在 link_to 助手上遇到了类似的问题,但已使用 remote:true 进行了更正

              【讨论】:

                猜你喜欢
                • 2023-03-31
                • 2012-12-08
                • 1970-01-01
                • 2020-08-29
                • 2016-12-30
                • 2012-12-24
                • 2015-04-30
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多